在空 java 程序中对象过大

Large size of objects during in empty java program

我分析了来自 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 需要大量 类 才能加载到 运行 您的代码中。查看它们的一种方法是为此使用 jmcd 实用程序:

jcmd <YOUR_PID> VM.class_hierarchy

你会看到有多少人。您还可以这样做:

jcmd <YOUR_PID> GC.class_histogram

并找出堆中现在有多少实例以及需要多少 space。

JVM 在进入应用程序的 main 方法之前很久就开始执行 Java 字节码。 JVM bootstrap 过程的重要部分是用 Java 编写的。特别是,这包括:

  • 正在创建标准 Java I/O 流;
  • 正在填写系统属性;
  • 引导JDK模块层;
  • 系统静态初始化classes;
  • System ClassLoader 初始化并加载应用程序主程序class。

这段初始化代码,写在Java中,当然有时会分配Java个对象。其中一些对象在 JVM 的整个生命周期内都保持活动状态。

描述了一种找出这些对象是什么以及它们分配在哪里的方法。

这是在 JVM bootstrap 期间分配的对象的可点击火焰图: