Java 点燃堆不释放,这是内存泄漏吗?

Java 点燃堆不释放,这是内存泄漏吗?,java,heap,ignite,Java,Heap,Ignite,我有一个20分钟的压力测试,在此期间,空闲JVM堆大小从97%下降到3%。即使我等待5个小时,可用空间的数量也不会改变。如果我再次尝试进行测试,GC的工作量太大,会导致JVM长时间暂停。我使用2.7 Ignite,我不在tje堆上保存数据,我使用jdbcthin保存数据。 我认为当我的测试结束时,JVM堆将实现,但它看起来不像 我在下面附加了JVM属性和配置 JVM属性 JVM_OPTS="$JVM_OPTS -Xms10g -Xmx10g -server" JVM_OPTS="$JVM_OPT

我有一个20分钟的压力测试,在此期间,空闲JVM堆大小从97%下降到3%。即使我等待5个小时,可用空间的数量也不会改变。如果我再次尝试进行测试,GC的工作量太大,会导致JVM长时间暂停。我使用2.7 Ignite,我不在tje堆上保存数据,我使用jdbcthin保存数据。
我认为当我的测试结束时,JVM堆将实现,但它看起来不像

我在下面附加了JVM属性和配置

JVM属性

JVM_OPTS="$JVM_OPTS -Xms10g -Xmx10g -server"
JVM_OPTS="$JVM_OPTS -XX:+AlwaysPreTouch"
JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC"
JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSClassUnloadingEnabled"
JVM_OPTS="$JVM_OPTS -XX:+CMSPermGenSweepingEnabled"
JVM_OPTS="$JVM_OPTS -XX:+ScavengeBeforeFullGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSScavengeBeforeRemark"
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/alidata/soft/ignite/heapdump -XX:+ExitOnOutOfMemoryError"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintAdaptiveSizePolicy"
JVM_OPTS="$JVM_OPTS -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Xloggc:/alidata/soft/ignite/gc/gc.log"
配置属性


172.16.14.14:47500..47509
172.16.14.15:47500..47509
172.16.14.16:47500..47509
172.16.14.17:47500..47509
3%图片


你能给我一些关于如何解决这个问题的建议吗?

ApacheIgnite不会使用太多堆,除非你碰巧使用了堆缓存

请确保在测试期间堆上没有保留太多数据


我建议收集一个堆转储,使用Eclipse MAT等工具对其进行分析,以了解那里发生了什么。

我可以看到堆由ConnectionManager持有。usedConns

但是,没有发布的Apache Ignite版本具有
ConnectionManager
类。当然不是在2.7里

如果您使用的是来自master branch的某种您自己的构建,那么您就有点自力更生了。考虑升级到最新版本,从<代码> IGITIT-2.8< /代码>分支,这个问题可能在那里被固定。该版本还没有发布,但是代码是可用的,并且可能比您正在使用的任何代码都更稳定


不管怎样。您没有真正运行Apache Ignite,当然也没有AI 2.7。

如果您没有时间提供小型复制机,请描述您的压力场景。调查确实很重要。
ConnectionManager.usedConn
上连接数量巨大的最主要原因是本地API上没有关闭JDBC连接和查询游标(
QueryCursor

AI 2.7使用螺纹局部连接,在简单情况下具有较少的潜在泄漏。
我们必须更改连接管理器逻辑以执行“惰性”模式(以减少大量结果集的堆使用)。

请包括输出,而不是它的图片,因为某些屏幕无法很好地显示图像,并且会导致其他可访问性问题。有什么原因不使用G1垃圾收集器吗?对于这类工作负载,它比您配置的并行GC要好得多。G1也有同样的问题,我肯定不会在堆缓存上使用。我有一个jmap:org.h2.table的命令。Column的实例非常大。我有一个问题:我用QueryEntity创建表,用JDBC进行更新或查询。影响是什么?我认为您执行的请求太大,并且/或者忘记关闭ResultSet。请考虑启用惰性SQL(<代码>懒惰= false < /代码>)。我有JDBC与JDBC模板或MyBATIS,结果集应该关闭。我可以试试懒SQL。但是现在JVM堆没有释放出来,我想当SQL完成时,JVM会释放出来。你确定你不是用一条语句(比如做
SELECT*
without
WHERE
)来提取整个缓存内容吗?对不起,我忘了我使用了gridgain-community-8.7.9,我改为gridgain-community-8.7.10,这个问题仍然存在。当我切换到apache-ignite-2.7.6时,这个问题已经解决了。这是一只虫子?@zhangzl不是不可能的。你能在某个地方发布这个问题的最小复制者吗?也许在GridGain论坛上,甚至在这里。