繁体   English   中英

内存提升后java.lang.ref.Finalizer OutOfMemory

[英]java.lang.ref.Finalizer OutOfMemory After Memory Raise

提取一个heapdump时,我意识到它有很多等待完成的对象,其中大多数是来自jdbc连接等库的实例。

知道队列中的那些实例基本上是实现finalize() ,为什么不将它们简单地终结?

几天前,我提起了这种情况的记忆。 最初它有1GB,新一代设置为256 MB( -Xmx1g -XX:NewSize=256m -XX:MaxNewSize=256m )。 添加一些繁重的缓存功能后,我们将分配给该实例的内存提高到3 GB( -Xmx3G -XX:NewSize=512m -XX:MaxNewSize=512m )。 从那一刻起,我们开始看到一些回忆。 经过一些调查,我发现了很多java.lang.ref.Finalizer和等待完成的对象。

这如何相互联系? 可能甚至相关吗?

为什么根本不将其最终确定?

一些组件花费更长的时间才能完成esp涉及IO的所有操作。 JDBC连接是相对较重的网络资源,因此花费的时间更长。

我建议您使用连接池(大多数JDBC库都内置了连接池),这样就不会一直在创建/销毁它们。

注意:要澄清1Gb = 1个1Gb位或128 MB(兆字节), 256 mb是256毫比特或大约1/4比特。 -XX:NewSize=512m是512 MB而不是256 MB。 -XX:MaxNewSize=512无效,因为它只有512个字节,很可能是您使用的-XX:MaxNewSize=512m

3Gb是3 GB,但假设您要表示3 GB,则不是-Xmx1G ,而是1 GB或8 Gb。

垃圾收集器在清理的最后一步调用Object.finalize() GC定期运行(取决于您使用的是哪个GC,如果是7和8,则可能是CMS,或者如果配置了G1,则为G1 )。 在“等待完成”中有很多对象可能意味着您有一个大堆,并且有足够的内存使GC不需要运行(CMS很有可能,因为G1运行微清理的频率更高)。

将GC跟踪添加到JVM启动参数,并监视其运行频率:-XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps请参见: http : //www.oracle.com/technetwork/java/javase/gc-tuning-6-140523 html的

如果您正在使用堆大于1Gb的许多小对象,则可能要考虑使用G1垃圾收集器,因为它更适合此类任务,并且不具有CMS的“世界停止”行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM