Kotlin CorDapp流测试中的内存泄漏

Kotlin CorDapp流测试中的内存泄漏,kotlin,garbage-collection,jvm,out-of-memory,corda,Kotlin,Garbage Collection,Jvm,Out Of Memory,Corda,在我的CorDapp中,我编写了一个定制的generateSpend函数(附在代码段中)。它使用tokenSelection.attemptSpend与generateExit和addtokenstoredeime结合使用来自不同发行人的代币来支付单一金额 示例:[成本为3块木材],支付方式为[2块木材由Nick持有,由Austin发行],[1块木材由Nick持有,由Nick发行] 我的实现有什么明显的问题吗?它导致了一个非常奇怪的内存泄漏错误:原因:java.lang.OutOfMemoryE

在我的CorDapp中,我编写了一个定制的generateSpend函数(附在代码段中)。它使用
tokenSelection.attemptSpend
generateExit
addtokenstoredeime
结合使用来自不同发行人的代币来支付单一金额

示例:[成本为3块木材],支付方式为[2块木材由Nick持有,由Austin发行],[1块木材由Nick持有,由Nick发行]


我的实现有什么明显的问题吗?它导致了一个非常奇怪的内存泄漏错误:
原因:java.lang.OutOfMemoryError:超出了GC开销限制

测试在隔离运行时通过,但在一次运行所有测试时失败。请注意,这里还有一百万其他可能出错的地方-我使用的是Corda 4.4最新版本

我尝试过的事情:

  • 调整gradle.properties参数以添加以下JVM参数(无影响)
    • Xmx2g
    • XX:MaxPermSize=512m
    • XX:+HEAPDUMPONAUTOFMEMORYERROR
    • XX:HeapDumpPath=/tmp/heapdump-XX:+UseG1GC
代码和错误:
/**
*当玩家在游戏中花费资源时,这些资源将作为事务的输入而消耗。发电机的费用
*方法利用令牌SDK来促进事务的构建,并在令牌使用时建议使用令牌
*已使用(烧毁)且未转移至对方。
*
*此方法使用令牌选择中的generateExit功能,并在适当的位置修改输入事务生成器。
*/
@暂停
有趣的产生(
serviceHub:serviceHub,
tb:TransactionBuilder,
费用:地图,
持有人:缔约方,
变更所有人:党,
additionalQueryCriteria:QueryCriteria?=null,
messageToLog:String=“”,
记录器:记录器?=null
):TransactionBuilder{
//创建令牌选择器
val tokenSelection=tokenSelection(serviceHub)
//为适当类型的令牌生成出口
costs.filter{it.value>0}.forEach{(类型、金额)->
val baseCriteria=heldTokenAmountCriteria(类型、持有者)
val queryCriteria=additionalQueryCriteria?.let{baseCriteria.and(it)}?:baseCriteria
//获取满足成本的代币列表
val tokensToSpend=tokenSelection
.AttemptExpense(类型的数量、tb.lockId、queryCriteria)
//对令牌运行检查以确保提议的事务有效
val notaryToCheck=tokensToSpend.first().state.notary
检查(tokensToSpend.all{it.state.notary==notaryToCheck}){“您正试图与不同的公证人一起使用资产。”}
检查(tokensToSpend.isNotEmpty()){“收到要花费的状态的空列表”。}
//开始使用代币以满足成本
var spentAmount=金额(0,类型)
代币消费
.groupBy{it.state.data.issuer}
弗雷奇先生{
val amountOfTokens=it.value.sumTokenStateAndRefs().withoutIssuer()
spentAmount=spentAmount.plus(amountOfTokens)
val(exitStates,change)=tokenSelection.generateExit(
它的价值,
如果(spentAmount.quantity>costs[type]!!)金额(Amount,type)为其他金额,
更改所有者)
AddTokenStoreDem(tb、现有状态、更改)
}
}
//返回经过修改的事务生成器
返回结核病
}
?[m io.github.classgraph.classgraph异常:扫描期间未捕获异常
在io.github.classgraph.ClassGraphException.newClassGraphException(ClassGraphException.java:89)~[classgraph-4.8.41.jar:4.8.41]
在io.github.classgraph.classgraph.scan(classgraph.java:1183)~[classgraph-4.8.41.jar:4.8.41]
在io.github.classgraph.classgraph.scan(classgraph.java:1201)~[classgraph-4.8.41.jar:4.8.41]
在io.github.classgraph.classgraph.scan(classgraph.java:1214)~[classgraph-4.8.41.jar:4.8.41]
在net.corda.core.internal.ClassGraphUtilsKt.pooledScan(ClassGraphUtils.kt:18)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.internal.ClassLoadingUtilsKt.createInstancesofClassSimplementing(ClassLoadingUtils.kt:22)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.serialization.internal.AttachmentsClassLoaderBuilder$withAttachmentsClassloaderContext$serializationContext$1.apply(AttachmentsClassLoader.kt:325)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.serialization.internal.AttachmentsClassLoaderBuilder$with attachmentsclassloadercontext$serializationContext$1.apply(AttachmentsClassLoader.kt:297)~[corda-core-4.4-SNAPSHOT.jar:?]
在java.util.HashMap.computeIfAbsent(HashMap.java:1127)~[?:1.8.0_211]
在java.util.Collections$SynchronizedMap.ComputeFabSent(Collections.java:2672)~[?:1.8.0Ó]
在net.corda.core.serialization.internal.AttachmentsClassLoaderBuilder.withAttachmentsClassloaderContext(AttachmentsClassLoader.kt:322)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.serialization.internal.AttachmentsClassLoaderBuilder.withAttachmentsClassloaderContext$default(AttachmentsClassLoader.kt:318)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.transactions.LedgerTransaction.internalPrepareVerify$core(LedgerTransaction.kt:217)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.transactions.LedgerTransaction.verify(LedgerTransaction.kt:207)~[corda-core-4.4-SNAPSHOT.jar:?]
在net.corda.core.transactions.TransactionBuilder.verify(TransactionBuilder.kt:559)~[corda-core-4.4-SNAPSHOT.jar:?]
在com.flows.SetupGameBoardFlow.call(SetupGameBoardFlow.kt:131)~[workflows-0.1.jar:?]
在com.flows.SetupGameBoardFlow.call(SetupGameBoardFlow.kt:33)~[workflows-0.1.jar:?]
在net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:270)~[corda-node-4.4-SNAPSHOT.jar:?]
位于net.corda.node.services.statemachine.FlowStateMachineI
@Before
fun setup() {
    network.runNetwork()
}
forkEvery(N)