java - 为什么 JMX 报告的 JVM 堆使用最大值会随时间变化?

标签 java jvm heap-memory

我的 JVM 堆最大值在我的一个 hadoop 集群的名称节点上配置为 8GB。当我使用 JMX 监视该 JVM 时,报告的最大值不断波动,如附图所示。

http://highlycaffeinated.com/assets/images/heapmax.png

我只在一个(最活跃的)hadoop 集群上看到这种行为。在其他集群上,报告的最大值保持固定在配置值。知道为什么报告的最大值会发生变化吗?

更新:

java版本是“1.6.0_20”

堆最大值在 hadoop-env.sh 中使用以下行设置:

export HADOOP_NAMENODE_OPTS="-Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

ps显示:

hadoop 27605 1 99 Jul30 ? 11-07:23:13/usr/lib/jvm/jre/bin/java -Xmx1000m -Xmx8G

更新 2:

昨晚在启动命令行添加了-Xms8G开关:

export HADOOP_NAMENODE_OPTS="-Xms8G -Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

如下图所示,最大值仍然在变化,尽管模式似乎已经改变。

http://highlycaffeinated.com/assets/images/heapmax2.png

更新 3:

这是一个新图表,它也显示了非堆最大值,它保持不变:

http://highlycaffeinated.com/assets/images/heapmax3.png

最佳答案

根据MemoryMXBean文档中,内存使用情况报告为两类,“堆”和“非堆”内存。 Non-Heap 类别的描述说:

The Java virtual machine manages memory other than the heap (referred as non-heap memory). The Java virtual machine has a method area that is shared among all threads. The method area belongs to non-heap memory. It stores per-class structures such as a runtime constant pool, field and method data, and the code for methods and constructors. It is created at the Java virtual machine start-up.

The method area is logically part of the heap but a Java virtual machine implementation may choose not to either garbage collect or compact it. Similar to the heap, the method area may be of a fixed size or may be expanded and shrunk. The memory for the method area does not need to be contiguous.

这个描述听起来很像永久代 (PermGen),它确实是堆的一部分,并计算使用 -Xmx 标志分配的内存。我不确定他们为什么决定单独报告它,因为它是堆的一部分。

我怀疑您看到的波动是 JVM 收缩和增长永久代的结果,这会导致报告的非 PermGen 可用的最大堆空间相应地发生变化。如果您可以获得 JMX 报告的堆和非堆最大值的总和,并且该总和在 8G 限制内保持不变,则可以验证该假设。

关于java - 为什么 JMX 报告的 JVM 堆使用最大值会随时间变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905220/

相关文章:

Java 依赖类无法通过 System.getProperty() 访问属性

java - 如何从自定义 LinkedList 类继承?

java - 无法让这款井字游戏公平进行

java - 避免 JSP 和 HTML 标记语法模糊(<、/和 > 字符)的方法?

java - 将部分 Java 虚拟机捆绑到一个项目中

java - 迭代构造函数内存困惑

java - 哪个实时 (RTSJ) JVM 最受青睐?

c++ - C 变量可以声明为空吗?

Javascript 数组访问(以字符串文字为键)- 空间复杂度

c - 堆上的函数体