Java 6 过多的内存使用
Java 6 消耗的内存是否比您预期的要多?
我有一个多年来一直在开发的应用程序,到目前为止,在我的特定测试配置中,它占用了大约30-40 MB;现在使用Java 6u10和11,它需要几百个活跃的时间。它会在50M到200M之间的任何地方反弹很多,当它闲置时,它会执行GC并立即丢弃内存。此外,它还会产生数百万个页面错误。所有这些都是通过Windows任务管理器观察到的。
因此,我在我的分析器(jProfiler)下并使用jVisualVM运行了它,并且它们都表明通常的中等堆和烫发使用量约为30M,即使完全处于活动状态进行负载测试周期也是如此。
所以我很困惑!它不仅仅是从Windows虚拟内存池请求更多内存 - 这显示为200M“内存使用情况”。
澄清:我想非常清楚地说明这一点 - 在Java VisualVM的18小时内观察到类堆和perm gen堆一直非常稳定。分配的易失性堆(eden和pregressed)在16MB处保持不变(它在前几分钟内达到),并且此内存的使用以从8MB到16MB均匀增长的完美模式波动,此时GC将其踢回8MB。在这 18 小时内,由于我运行了压力测试,系统处于恒定的最大负载状态。此行为是完全且一致的可重现性,在多次运行中可见。唯一的异常是,当这种情况发生在Windows上时,通过任务管理器观察到的从Windows中获取的内存从64MB到900 + MB到900 + MB到所有地方波动。
2008-12-18 更新:我使用 -Xms16M -Xmx16M 运行程序,没有任何明显的不利影响 - 性能很好,总运行时间大致相同。但从短期来看,内存使用量仍然达到峰值,约为180M。
2009-01-21更新:似乎答案可能在于线程数量 - 请参阅下面的答案。
编辑:我的意思是字面上有数百万个页面错误 - 在30M +的区域。
编辑:我有一台4G机器,所以200M在这方面并不重要。