我目前正在研究最新Java 8版本的G1 GC。
我有“Humongous Allocation”的问题,所以我想知道我的区域大小有多大。
如何确定区域大小的设置有多大?
我如何自己计算区域大小?
由于
答案 0 :(得分:3)
Java-8中的G1区域大小基于startingHeapSize/2048
并向下舍入到1MB到32MB之间的第一个2的幂;不支持区域大小< 1MB或> 32MB。
您还可以通过-XX:G1HeapRegionSize=n
设置区域大小(请注意,该值具有相同的2次幂/范围限制)。
所以实际上JVM似乎偏向2048到4095之间的区域数(假设堆在2GB到128GB之间)。
通常这些是每个堆大小范围的区域大小:
<4GB - 1MB
<8GB - 2MB
<16GB - 4MB
<32GB - 8MB
<64GB - 16MB
64GB+ - 32MB
注意,MB实际上是MiB,GB实际上是GiB
答案 1 :(得分:2)
关于“如何找出设置的区域大小?”,您可以使用-Xlog:gc*
标志(Java 9或更高版本)启动Java,而不用计算它,而该标志应该在一开始就打印:< / p>
[0.003s][info][gc,heap] Heap region size: 1M
[0.004s][info][gc ] Using G1
[0.004s][info][gc,heap,coops] Heap address: 0x00000000fc000000, size: 64 MB, Compressed Oops mode: 32-bit
答案 2 :(得分:1)
区域大小由JVM在启动期间根据堆的大小计算。 堆的默认值是物理内存的1/4或1GB(以较小者为准)。请参阅this。
区域大小可以从1 MB到32 MB不等,具体取决于堆大小。目标是不超过2048个地区。
您可以通过在启动脚本中指定-XX:G1HeapRegionSize=XX
来覆盖大小。
答案 3 :(得分:1)
要查看区域大小,请使用jinfo -flags your_pid
Non-default VM flags: -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=1054867456 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=5368709120 -XX:MaxNewSize=3221225472 -XX:MinHeapDeltaBytes=1048576 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC