我分析了来自 Java 程序的简单堆转储,该程序在 main 方法中仅包含此内容。
public static void main(String[] args) throws IOException {
System.in.read();
}
使用 HPROF 解析器库,我的输出是:
Done, found:
Classes: 473
Instances: 13161
Namespace java
Classes: 251
Instances: 9033
怎么可能有这么多实例,而我却没有创建它们中的任何一个。这些是 Java 运行时实例吗?
最佳答案
JVM 在进入应用程序的 main
方法之前很久就开始执行 Java 字节码。 JVM Bootstrap 的重要部分是用 Java 编写的。特别是,这包括:
- 创建标准的 Java I/O 流;
- 填写系统属性;
- 引导 JDK 模块层;
- 系统类的静态初始化;
- 初始化System ClassLoader并加载应用程序主类。
当然,这段初始化代码是用 Java 编写的,有时会分配 Java 对象。其中一些对象在 JVM 的整个生命周期内都保持 Activity 状态。
This answer描述了一种找出这些对象是什么以及它们分配在哪里的方法。
这是 JVM 引导期间分配的对象的可点击火焰图:
关于java - 空 java 程序中的大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65962506/