我们最近将我们的一个应用程序从Java 1.4升级到了Java 6。
通过一些负载和性能测试,我们观察到,与Java1.4相比,Java 6中的可用内存通常处于更低的水平。
在使用Java6对应用程序进行了一些分析之后,我们注意到许多不再被任何其他对象引用的对象(即垃圾回收的候选对象)留在内存中,显然从未被垃圾回收过。我们将此作为较低可用内存的解释。
问题是:垃圾收集的行为方式是否从Java 1.4更改为Java 6?
发布于 2010-08-20 17:12:43
从Java1.4到Java6,
垃圾收集的行为方式有变化吗?
一定!
从Java1.4到Java6是一个相当长的时间跨度(根据this wiki article的说法,从initial releases到initial 1.4 release到the current Java 6 release几乎有5年的时间,超过8年的时间)。
在这段时间内应用了许多更改和优化,只要您的程序仍然可以工作,您就不应该真正关心。
拥有更多的已用内存只意味着JVM不会在不需要的时候浪费时间进行垃圾收集。如果您希望它使用更少的内存,那么您应该减少最大堆(或者调整JVM参数;this article解释了如何在Java5中做到这一点,许多建议仍然适用)。
如果你真的得到了以前没有得到的OutOfMemoryError,那就有点不同了。然后,您应该检查如何使用弱引用和软引用,或者作为最后的手段,尝试找出是否遇到了JVM错误。
发布于 2010-08-20 17:14:59
发布于 2010-08-20 17:15:37
Java SE在8年内发生了很大变化。
关于垃圾收集器,Java SE 6已经改进了很多。在JavaSE6Update14中引入了新的Garbage First GC。
https://stackoverflow.com/questions/3529505
复制相似问题