java - 如何确定各种Java 8堆内存名称?

标签 java java-8 heap-memory

我想以编程方式确定 Java 堆内存名称。当我运行下面的代码时,即使相同的 java 安装在两台不同的机器上,它也会为 java 堆内存提供两个不同的名称。

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;

public class MemTest {
    public static void main(String[]args) {
        for (MemoryPoolMXBean mpBean : ManagementFactory.getMemoryPoolMXBeans()) {
            System.out.println(mpBean.getType());
            System.out.println(mpBean.getName());
        }
    }
}

机器 1 的输出

support@vrni-platform:~$ java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
support@vrni-platform:~$ vi MemTest.java
support@vrni-platform:~$ javac MemTest.java
support@vrni-platform:~$ java MemTest
Non-heap memory
Code Cache
Non-heap memory
Metaspace
Non-heap memory
Compressed Class Space
Heap memory
PS Eden Space
Heap memory
PS Survivor Space
Heap memory
PS Old Gen

java设置的输出

java -XshowSettings:vm -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=32773376 -XX:MaxHeapSize=524374016 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
VM settings:
    Max. Heap Size (Estimated): 485.31M
    Ergonomics Machine Class: client
    Using VM: Java HotSpot(TM) 64-Bit Server VM

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

机器 2 的输出

support@vrni-platform:~$ java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
ubuntu@vrni-platform:~/logs/tsdb-server$ vim MemTest.java
ubuntu@vrni-platform:~/logs/tsdb-server$ javac MemTest.java
ubuntu@vrni-platform:~/logs/tsdb-server$ java MemTest
Non-heap memory
Code Cache
Non-heap memory
Metaspace
Non-heap memory
Compressed Class Space
Heap memory
Eden Space
Heap memory
Survivor Space
Heap memory
Tenured Gen

java设置的输出

java -XshowSettings:vm -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=262920896 -XX:MaxHeapSize=4206734336 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
VM settings:
    Max. Heap Size (Estimated): 3.48G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) 64-Bit Server VM

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

有人可以告诉我为什么在环境相同时(Ubuntu 14.04,Java 版本相同),堆内存会给出两个不同的名称吗? 堆内存所有可能的名称是什么?

最佳答案

堆内存区域是所使用的垃圾收集器的一项功能。

机器之间的差异是由于机器 1 被分类为客户端机器,而机器 2 被分类为服务器机器。原因是可用内存量。分类的差异导致选择不同的垃圾收集器(具体为机器1的串行收集器和机器2的并行收集器),进而导致堆内存区域的差异。

另请参阅Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide ,特别是 Garbage Collector, Heap, and Runtime Compiler Default Selections 部分.

关于java - 如何确定各种Java 8堆内存名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51078617/

相关文章:

c - 将 C 结构存储在堆栈上是一种好习惯吗?

内存分配期间堆损坏

java - Headerenricher Spring Integration 和 java dsl

java - 通过JDBC PreparedStatement执行选择时出现“日期格式图片结束..”错误

Java 8 mapToInt 和 toIntFunction 示例

java - 从 Java 8 升级到 Java 11 - 包 sun.util 不存在

java - 如何在Java中访问带有特殊字符(反斜杠)的密码保护的url?

java - 尝试从共享首选项中检索数据时我遗漏了什么

java - 为什么刷新对 System.err 不起作用?

c - 分配() |堆栈和堆位置的内存地址长度差异 | C编程