提取堆转储后,我发现它有很多对象等待最终确定,其中大多数是来自 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 和等待终结的对象。
这怎么可能相互关联呢?甚至可能有关联吗?
最佳答案
why would they simply not be finalized?
某些组件需要更长的时间才能完成,尤其是涉及 IO 的任何组件。 JDBC 连接是相对较重的网络资源,因此需要更长的时间。
我建议您使用连接池(大多数 JDBC 库都内置了它们),这样您就不会一直创建/销毁它们。
注意:澄清 1Gb
= 1 gig-bit 或 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。
关于内存提升后 java.lang.ref.Finalizer OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790902/