Java 6中GC的默认调度是什么?(1.6.0-25)

3
我想知道在Java 6(64位)机器上默认的GC运行计划大约是什么?我知道它可以在没有任何计划的情况下触发,但仍然,这将是默认行为吗?
我不知道Java是否以-server选项运行。我该如何检查?当我执行“ps ax | grep java”时,我没有看到它,但是,它仍然可以以服务器模式运行吗?这取决于安装的JVM还是物理服务器的类型?请告诉我如何了解这一点。

4
不,你不能触发它!你可以友好地请求它。 - Philipp Sander
我知道这一点。我的观点是,垃圾回收可以独立于任何时间表运行,无论是由人类触发(正如你所说的“友好地请求”),还是自己触发,比如当它的内存不足时。 - javagirl
3
没有时间表,如果这是你的意思的话。 - Marko Topolnik
@MarkoTopolnik 如果您在jconsole上查看内存使用情况,会发现垃圾回收运行得相当频繁,因此应该有某种计时器在起作用。当然,我并不是指像cron那样的基于时间的调度... - javagirl
3
只有在内存分配稳定时,垃圾回收才会定期运行。这里绝对没有涉及计时器。 - Marko Topolnik
显示剩余4条评论
3个回答

4
首先,如果要打印出所有默认的JVM设置,请使用:java -XX:+PrintFlagsFinal -version
默认情况下,JVM Hotspot运行在-client模式下。
当启动脚本时,您可以使用以下参数-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log获得一个包含在VM启动时设置的所有属性/参数的日志。
关于垃圾回收(GC),默认值由JVM Ergonomics确定,请参见Java SE 6 HotSpot [tm]虚拟机垃圾回收调整。简而言之:
如果没有在命令行上设置,初始堆大小和最大堆大小都是基于机器上的内存量计算的,默认的最大堆大小不会超过1GB,无论机器上安装了多少内存。
在同一份文档中,选择的GC算法取决于硬件配置,VM将在SerialParallel收集器之间进行决策。 若要查看最终运行的是哪个,请启用GC日志记录。
还应查看以下Q/A:如何确定默认的java堆大小?

2

感谢您在回答中提到了服务器部分。但是GC - 这是一份庞大的文档,我认为有人会给出一个精确的答案。所以我的JVM确实是服务器版本,1.6,64位。在这种情况下的时间表是什么? - javagirl
那就是问题所在,没有简短的答案。 - Aleš

2
如果您每秒创建 10 MB 的垃圾,并且您拥有 100 MB 的 Eden 空间,那么需要 10 秒才能填满,您将每 10 秒看到一次 GC。减少垃圾或使 Eden 空间更大,收集之间的时间间隔将更长。
默认计时器为一小时,称为“DGC”。如果一个小时内没有进行任何收集,则可以触发完整的 GC 来清理任何分布式对象。我通常将其设置为一周。
默认值为:
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000

作为一个设计低延迟系统的人,我会将Eden空间设得比每天产生的垃圾更大。在系统未被使用时,我会通过代码触发一次完整的收集,这样你就不会在白天看到任何收集,无论是小型还是大型的。

以下是Java中真实低延迟交易系统的示例。

http://vanillajava.blogspot.com/2011/06/how-to-avoid-garbage-collection.html

顺便提一下,Java 6更新25现在已经相当老了,如果不是Java 7更新40,我会考虑Java 6更新45。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接