如何为具有 22G 堆的服务器正确设置 G1GC 选项

Fra*_*ank 0 java garbage-collection jvm jvm-hotspot

我\xe2\x80\x99m设置了一个新的JAVA服务器,堆大小设置为22G,并且将使用G1GC算法。我已经阅读了所有的oracle文档,并且相信这就是我们需要的,但仍然有几个问题:

\n

1> -XX:G1HeapRegionSize 应该是什么?该数字必须是 2 的幂吗?如果是这样,我应该设置 8M 以获得 2816 个区域,还是设置 16M 以获得 1408 个区域?

\n

2> 您认为我们应该显式设置 -XX:ParallelGCThreads 和 -XX:ConcGCThreads 吗?如果省略,是否会根据服务器逻辑处理器将它们设置为默认编号?或者只是设置为固定数字?

\n

3> 下面的选项怎么样,有什么我错过的吗?由于这是我们第一次使用G1GC,所以我不知道是否需要设置其他G1相关选项,因为它们都有推荐的默认值。(在https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc_tuning.html中进行了描述中进行了描述)

\n

// 常用选项

\n
\n

-Xms22G -Xmx22G -Xss1024K

\n
\n

// G1 选项

\n
\n

-XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:G1HeapRegionSize=16

\n
\n

// 日志

\n
\n

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps

\n

-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:-PrintCommandLineFlags

\n
\n

4> 你认为第一次有可能把事情做得大致正确吗?我的意思是没有内存溢出或耗尽。或者您认为我们总是需要更仔细地调整参数才能使事情正确几次?

\n

5> 还有其他建议吗?

\n

有点长,感谢您的阅读。任何帮助将不胜感激。谢谢你!

\n

Ste*_*n C 5

引用您链接到的文档:

G1 GC 是一种自适应垃圾收集器,其默认设置使其无需修改即可高效工作

因此,根据文档本身,最明显的建议是在不进行任何 GC 调整的情况下运行 JVM。只需给它堆大小,然后选择 GC:

-Xmx22G -XX:+UseG1GC
Run Code Online (Sandbox Code Playgroud)

G1GC 的设计使您能够以这种方式使用它并获得良好的性能。

如果它运行得足够好,那么这就是您需要做的。如果您发现性能问题,请开始根据您所看到的问题的性质进行调整。

仅仅为了调整而调整是浪费时间。

当您(还)不知道性能问题时进行调整有点像蒙着眼睛进行射击。与什么都不做相比,你很可能会让事情变得更糟。

最后,“最佳”GC 设置将取决于应用程序和工作负载的各个方面以及调整的目标。我们可能提出的任何建议都纯粹是猜测。