Трассировка стека показывает:
at io.github.classgraph.ClassGraph.scan(ClassGraph.java:1185) ~[classgraph-4.6.12.jar:4.6.12]
at net.corda.core.internal.ClassGraphUtilsKt.pooledScan(ClassGraphUtils.kt:18) ~[corda-core-4.0.jar:?]
at net.corda.core.internal.ClassLoadingUtilsKt.createInstancesOfClassesImplementing(ClassLoadingUtils.kt:22) ~[corda-core-4.0.jar:?]
Другими словами, похоже, что каждый раз, когда вызывается createInstancesOfClassesImplementing
, запускается новое сканирование ClassGraph. Если предположить, что этот метод вызывается много раз , то это не только крайне неэффективно, но и сканирование всего пути к классам для каждого нового сканирования может привести к огромным затратам памяти, если ссылка на ScanResult
удерживается для каждого нового сканирования.
Трассировка стека также показывает два отдельных сканирования, которые выполняются одновременно, поэтому вы, вероятно, запускаете сканирование из более чем одного потока одновременно.
Правильный способ решить эту проблему - сканировать путь к классам только один раз при инициализации, а затем повторно использовать ScanResult
в ClassLoadingUtilsKt
вместо повторного сканирования, чтобы каждый раз генерировать новый ScanResult
.