我正在玩jmap
并发现简单的“Hello World”Java 程序创建了数千个对象。这是对象的截断列表Oracle JVM 更新 131启动时创建:
num #instances #bytes class name
----------------------------------------------
1: 402 4903520 [I
2: 1621 158344 [C
3: 455 52056 java.lang.Class
4: 194 49728 [B
5: 1263 30312 java.lang.String
6: 515 26088 [Ljava.lang.Object;
7: 115 8280 java.lang.reflect.Field
8: 258 4128 java.lang.Integer
9: 94 3760 java.lang.ref.SoftReference
10: 116 3712 java.util.Hashtable$Entry
11: 126 3024 java.lang.StringBuilder
12: 8 3008 java.lang.Thread
13: 74 2576 [Ljava.lang.String;
14: 61 1952 java.io.File
15: 38 1824 sun.util.locale.LocaleObjectCache$CacheEntry
16: 12 1760 [Ljava.util.Hashtable$Entry;
17: 53 1696 java.util.concurrent.ConcurrentHashMap$Node
18: 23 1472 java.net.URL
19: 14 1120 [S
20: 2 1064 [Ljava.lang.invoke.MethodHandle;
21: 1 1040 [Ljava.lang.Integer;
22: 26 1040 java.io.ObjectStreamField
23: 12 1024 [Ljava.util.HashMap$Node;
24: 30 960 java.util.HashMap$Node
25: 20 800 sun.util.locale.BaseLocale$Key
我知道 JVM 从 JAR 文件加载类并期望看到java.lang.Class
, java.lang.String
and [Ljava.lang.Object
. 258 java.lang.Integer
物体对我来说也很清楚:这就是Integer
cache.
But java.lang.reflect.Field
? Hashtable
? Many StringBuilder
s? java.util.concurrent.ConcurrentHashMap
?这是从哪里来的?
该程序非常简单:
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("Hello world");
System.in.read();
}
}
JVM 详细信息:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
乌班图16.04。
您可以通过运行应用程序来找到答案-XX:+TraceBytecodes
flag.
该标志可用于HotSpot JVM 的调试版本 https://stackoverflow.com/questions/40257504/trace-java-bytecode-stream/40296353#40296353.
这是详细的火焰图(可单击的 SVG),显示分配的对象来自的堆栈跟踪。
就我而言,启动拨款的主要来源是
- URLClassLoader 和扩展类加载器
- 区域设置缓存
- 使用追踪客户端
- 元索引注册表 http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7/src/share/classes/sun/misc/MetaIndex.java#l38
- 系统属性
- 字符集初始化
P.S. 剧本 https://gist.github.com/apangin/543f365dde05df0085083e82a3284866用于生成火焰图 https://github.com/brendangregg/FlameGraph来自 TraceBytecodes 输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)