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