我们最近将其中一个应用程序从Java 1.4升级到Java 6.
有些负载&在性能测试中,我们观察到Java 6中的可用内存通常保持在比Java 1.4更低的水平。
在使用Java 6对应用程序进行一些分析之后,我们注意到许多其他对象(即垃圾收集的候选者)不再引用的对象保留在内存中,并且显然从未被垃圾收集。我们把它作为较低可用内存的解释。
问题是:垃圾收集的行为方式是否已从Java 1.4更改为Java 6?
答案 0 :(得分:15)
垃圾收集行为从Java 1.4改为Java 6的方式是什么?
当然!
Java 1.4到Java 6是一个相当长的时间跨度(initial releases之间差不多5年,initial 1.4 release和the current Java 6 release之间超过8年。 this wiki article)。
在此期间会应用许多更改和优化,只要您的程序仍然有效,您就不应该非常关心。
仅使用更多内存意味着JVM在不需要时不会浪费时间进行垃圾回收。如果您希望它使用更少的内存,那么您应该减少最大堆(或以其他方式调整JVM参数; this article解释如何在Java 5中执行此操作,大部分建议仍然适用)。
如果你实际上得到了之前没有得到的OutOfMemoryError
,那就有点不同了。然后你应该检查你如何使用弱引用和软引用,或者作为最后的手段试着找出你是否遇到了JVM错误。
答案 1 :(得分:5)
对垃圾收集进行了几次优化,介于1.4和5之间 在5到6之间
oracle / sun在网上有一些关于性能差异的白皮书。
http://java.sun.com/performance/reference/whitepapers/5.0_performance.html#2.11
http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.2
答案 2 :(得分:3)
Java SE在8年内发生了很大变化。
关于垃圾收集器,使用Java SE 6进行了大量改进。 在Java SE 6 Update 14中引入了新的Garbage First GC。