当前位置: 首页 > 知识库问答 >
问题:

Corda 无法执行由 Java 堆空间 OOM 导致的简单流,并显示“扫描时出现异常”

缑修齐
2023-03-14

在Corda 3.3中工作正常,但在Corda 4.0中失败

节点正常启动,然后当我调用第一个非常简单的流时——会发生这个错误。

我试图用2048堆空间运行node,但是没有成功。

堆栈跟踪:

共有2个答案

曾晨
2023-03-14

堆栈跟踪显示:

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的引用,则扫描每个新扫描的整个类路径可能会导致巨大的内存开销。

stacktrace还显示了同时进行的两个独立扫描,因此您可能一次从多个线程启动扫描。

解决这个问题的正确方法是,在初始化时只扫描一次类路径,然后重用ClassLoadingUtilsKt中的ScanResult,而不是每次重新扫描生成一个新的ScanResult

邢起运
2023-03-14

此问题可能与自定义白名单序列化扫描代码有关。

我们需要将节点的最大堆大小提高到1GB。有关详细信息,请参阅以下链接-
https://r3-cev.atlassian.net/browse/CORDA-2436

另请参阅 - https://r3-cev.atlassian.net/browse/CORDA-2437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

 类似资料:
  • 我正在使用Sonar Runner 2.2并设置,但我得到以下错误: 这怎么可能呢?

  • 我是新手Java8,在下面的示例中,我创建了一个Map,其中keyvalue为String,value为ArrayList的整数。 我编写了以下代码来针对每个键执行数组列表元素的总和,并尝试将总和值存储在单独的 ArrayList 中。 当我尝试执行以下代码时,我收到以下异常。 线程“main”中出现异常Java . lang . unsupportedoperationexception Jav

  • 我正在使用cucumber应用BDD方法,这很棒! 问题是我的测试套件变得越来越大,现在我得到了下面的异常,它由于错误的原因使我的测试失败... 我正在使用所有排序或cucumber功能,例如:背景,场景大纲和简单场景。我像这样运行测试: 我将我的特征文件分割到不同的目录(控制器1,控制器2...)和跑步者(RunCukes1Test,RunCukes2Test...),但这都无济于事。 当我运行

  • 问题内容: 我正在看C#教程,并遇到StackOverflowException。 叙述者使用下面的代码段提供了一个很好的此类例外示例, 我在C ++和Java中寻找这种类型的简单代码的一些示例,尤其是在javascript中,这可能会导致堆栈溢出。 问题答案: 在Java中: 通常,任何不终止或迭代太多的递归函数都会导致此问题。

  • 可能没有多少开发人员像我一样面临这个问题<但是我想分享我已经解决了将近一个月的解决方案 我使用Kubernetes和docker compose,此Webflux服务(容器)设置了内存限制1g

  • 我有麻烦更新一个变量的名称为一个对象使用扫描器。我提供一个菜单给用户,用户选择他的选择(更新名称),程序要求用户输入新的名称,扫描器读取system.in并更新变量的名称。唯一的问题是程序不能读取带有空格的字符串。例如: 如果键入类似的内容,则可以执行此操作,但如果键入,则将得到,输出示例如下 所以我猜它只读取t,当扫描器扫描shipProperty值时,它读取dog而不是等待输入。我读过关于的文