【问题标题】:Large size of objects during in empty java program空Java程序中的大尺寸对象
【发布时间】:2021-05-03 20:19:48
【问题描述】:

我分析了 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 运行时实例吗?

【问题讨论】:

    标签: java memory jvm


    【解决方案1】:

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

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

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

    This answer 描述了一种找出这些对象是什么以及分配位置的方法。

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

    【讨论】:

      【解决方案2】:

      JVM 需要加载很多类来运行您的代码。查看它们的一种方法是为此使用jmcd 实用程序:

      jcmd <YOUR_PID> VM.class_hierarchy
      

      你会看到有多少。你也可以这样做:

      jcmd <YOUR_PID> GC.class_histogram
      

      并找出堆中现在有多少实例以及占用了多少空间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 2012-01-24
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 2015-01-26
        相关资源
        最近更新 更多