【发布时间】:2011-03-21 18:41:29
【问题描述】:
我是在 32 位 Windows 上使用 Java JRE 启动 Java 客户端,使用
java -Xmx1024m -Xms1024m -verbose:gc -XX:+PrintGCDetails -jar myJar.jar
我的 jar 包含大量数据(双精度表,600ish MB),它们在应用程序的整个生命周期中都保留在内存中。
然后它大约每分钟给出一次日志消息,说:
[GC [DefNew: 279616K->279616K(314560K), 0.0002037 secs][Tenured: 595827K->599952K(699072K), 1.1020398 secs] 875443K->599952K), [Per>(1013632) : 10042K->10042K(16384K)], 1.1030218 secs] [Times: user=1.09 sys=0.01, real=1.11 secs]
我真的不明白粗体部分。它说新一代从 279616K 到 279616K(即没有任何变化),老一代略有增加(595827K->599952K),但总的来说它说 875443K->599952K,即减少了约 30%。这怎么可能?
编辑:完全清楚,我希望如果我添加 279616K+595827K=875443K 我会得到第一部分粗体,即总堆大小。同样,我预计 279616K+599952K 将以粗体显示第二部分,但事实并非如此。在下面指定的链接Java Garbage Collection Log messages 中,它确实加起来了,所以我可能遗漏了一些东西。
【问题讨论】:
-
您使用 Sun JDK 吗?如果是这样,您可能想看看Java Tuning White Paper。其次,您能否提供更多背景信息?即操作系统,过程数据模型(32 位或 64 位)...
-
在我想优化某些东西之前,我首先想了解当前日志消息的内容(在我的例子中,NewRatio=4 并且使用并发 GC 修复了我的 troughtput 问题)。