垃圾收集从Java1.4更改为Java6?

垃圾收集从Java1.4更改为Java6?,java,garbage-collection,Java,Garbage Collection,我们最近将一个应用程序从Java1.4升级到Java6 通过一些负载和性能测试,我们发现Java6中的可用内存通常比Java1.4中的可用内存低很多 在使用Java 6对应用程序进行了一些评测之后,我们注意到许多对象不再被任何其他对象引用(即垃圾收集的候选对象)留在内存中,并且显然从未被垃圾收集过。我们认为这是可用内存较低的原因 问题是:垃圾收集的行为方式是否从Java1.4更改为Java6 垃圾收集的行为方式是否从Java1.4更改为Java6 当然 Java1.4到Java6是一个相当长的时

我们最近将一个应用程序从Java1.4升级到Java6

通过一些负载和性能测试,我们发现Java6中的可用内存通常比Java1.4中的可用内存低很多

在使用Java 6对应用程序进行了一些评测之后,我们注意到许多对象不再被任何其他对象引用(即垃圾收集的候选对象)留在内存中,并且显然从未被垃圾收集过。我们认为这是可用内存较低的原因

问题是:垃圾收集的行为方式是否从Java1.4更改为Java6

垃圾收集的行为方式是否从Java1.4更改为Java6

当然

Java1.4到Java6是一个相当长的时间跨度(根据统计,从和到之间的时间跨度大约为5年,而从和到之间的时间跨度超过8年)

在这段时间内应用了许多更改和优化,只要程序仍然工作,您就不应该真正关心这些更改和优化

使用更多的内存只意味着JVM不会在不需要的时候浪费时间进行垃圾收集。如果您希望它使用更少的内存,那么您应该减少最大堆(或者调整JVM参数;在Java5中解释了如何做到这一点,大部分建议仍然适用)


如果您实际上得到了以前没有得到的
OutOfMemoryError
,则情况会有所不同。然后,您应该检查如何使用弱引用和软引用,或者作为最后手段,尝试找出是否遇到JVM错误。

在1.4和5之间以及5和6之间对垃圾收集进行了多次优化

Oracle/Sun在线发布了一些关于性能差异的白皮书:


Java SE在8年内发生了很大变化

关于垃圾收集器,它有了很大的改进。
在JavaSE6Update14中引入了新的GC。

我认为假设JVM的所有部分,包括GC,在这些年中都得到了改进,这是一种节省。。。您确定这些物品是真正的候选收藏品吗?如果您通过JConsole启动收集,它们会被收集吗?Java 7意味着在垃圾收集器上有更多的“优化”。您确实强迫JVM彻底清理了吗?@Jon Freedman,是的,它们是真正的候选者。虽然G1附带的版本>=u14,但默认情况下在任何Java 6版本中都不会启用,据我所知,它不是,你必须用
-XX:+UnlockExperimentalVMOptions-XX:+UseG1GC
HEBERT来激活它,除非你用的是G1和Java 7。