java - 空 java 程序中的大对象

标签 java memory jvm

我分析了来自 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 引导期间分配的对象的可点击火焰图:

JDK bootstrap allocation Flame Graph

关于java - 空 java 程序中的大对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65962506/

相关文章:

jvm - 我很好奇 ldc 在 JVM 中的缩写是什么?

java - 是否可以在 visual studio 中调试 JNI DLL?

C - 将字符串保存到数组元素中

c - 奇怪的双指针更新内存位置

java - 确定从何处加载特定类

java - Tomcat 内存消耗

java - 如何将pdf/byte[]消息阅读器添加到exchangeStrategies,不支持内容类型 'application/pdf'

java - 使用java根据静态 map 中提到的顺序进行排序

java - IntelliJ 对 Cucumber 4.7 的支持

java - 非常大的堆大小,但使用的内存很小