VisualVM显示的Max Heap Size是Xmx的两倍

10

我有如下问题:

有一个Java虚拟机,Xmx选项设置为70000m = 70GB(是的,它很大)。但是如果我监视上述JVM,最大堆显示为140000m(如屏幕截图中所示)。

屏幕截图

下面是使用的JVM选项列表:

-XX:+UseG1GC
-Duser.timezone=Europe/Berlin
-Djava.security.egd=file:///dev/urandom
-Dsun.rmi.transport.tcp.handshakeTimeout=180000
-Dsun.rmi.dgc.client.gcInterval=600000
-Dsun.rmi.dgc.server.gcInterval=600000
-verbose:gc
-XX:CICompilerCount=2
-Xrunjdwp:transport=dt_socket,server=y,address=3997,suspend=n
-Xms70000m
-Xmx70000m
-XX:+UnlockExperimentalVMOptions
-XX:G1HeapRegionSize=32
-XX:MaxGCPauseMillis=200
-XX:G1NewSizePercent=2
-XX:G1MaxNewSizePercent=60
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:InitiatingHeapOccupancyPercent=45
-XX:G1MixedGCLiveThresholdPercent=65
-XX:G1HeapWastePercent=10
-XX:G1OldCSetRegionThresholdPercent=10
-XX:G1ReservePercent=10

有人知道为什么VisualVM显示双倍的最大堆大小吗?


2
70000 MB = 70 GB。您确认需要这么大的堆吗?我认为这不正确。 - duffymo
我的错误 - 感谢您的纠正。 - duffymo
是的,它确实很大! - dRoeder
顺便提一下,我们有一台拥有192GB内存的服务器,运行着三个JVM(一个30GB,两个70GB)。 - dRoeder
现在很清楚 - JVM没有足够的内存。你需要为JVM本身和其他对象提供更多内存。即使是70GB的JVM也不足够。 - duffymo
你的回答不够清晰。我想问一下为什么VisualVM显示最大堆大小为140GB,尽管Xmx设置为70GB。没有出现内存不足的错误。在具体的情况中(截图所示),只使用了30%的堆。 - dRoeder
1个回答

11

使用G1垃圾收集器时,visualVM存在一个bug,它的最大值实际上并不那么大。而jconsole报告的是正确的。

以下报告提供了一个可能的解释。原因在于,不同的代不再有固定的大小,而是每个代的最大大小都是整个堆的大小(因为它们都可以使用尽可能多的空间)。我尚未找到任何官方的错误报告。


1
这是Github的错误报告链接:https://github.com/oracle/visualvm/issues/127 - Alex Colomb

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