3

我想知道在 java 6(64 位)机器上运行的默认调度 GC 大约是什么?我知道它可以在没有任何时间表的情况下触发,但是,默认行为是什么?

我不知道 java 是否与 -server 选项一样运行。我该如何检查?我在 java 进程命令中看不到它(当我执行 'ps ax|grep java' 时),但它仍然可以在服务器模式下运行吗?它取决于安装的 jvm 还是物理服务器的类型?请让我知道我怎么知道这一点。

4

3 回答 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] Virtual Machine Garbage Collection Tuning。简而言之 :

如果没有在命令行中另外设置,初始和最大堆大小是根据机器上的内存量计算的,默认的最大堆大小不会超过 1GB,不管机器上安装了多少内存。

在同一个文档中,选择的 GC 算法取决于硬件设置,VM 将在串行并行收集器之间做出决定。要查看最终运行的是哪一个,请启用 GC 日志记录。

并且,您应该查看以下 Q/A:默认 Java 堆大小是如何确定的?

于 2013-09-24T17:44:23.797 回答
2

如果您正在创建 10 MB/秒的垃圾并且您有 100 MB 的 Eden 空间,则需要 10 秒才能填满,并且您将每 10 秒看到一次 GC。创建更少的垃圾或使 Eden 空间更大,收集之间的间隔会更高。

有一个一小时的默认计时器,称为“DGC”。如果一个小时内没有发生收集,则可以触发一次完整的 GC 以清理任何分布式对象。我通常将此设置为一周。

默认值为

-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000

顺便说一句,当我设计低延迟系统时,我使伊甸园空间大于一天产生的垃圾量。当系统不被使用时,我每天会在代码中触发一次完整的收集。这样,您将在白天看不到任何收藏品,无论是次要还是主要。

这是一个来自 Java 中真正的低延迟交易系统的示例。

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

顺便说一句,Java 6 update 25 现在已经很老了,如果不是 Java 7 update 40,我会考虑 Java 6 update 45。

于 2013-09-24T13:58:29.187 回答
2

有关垃圾收集器的信息:http ://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

如果您想知道您的虚拟机是否在服务器模式下运行:

java -version

然后寻找类似的东西:

Java HotSpot(TM) 64 位服务器虚拟机 (...)

于 2013-09-24T11:31:58.177 回答