为了账号安全,请及时绑定邮箱和手机立即绑定

jdk 8运行空main函数,为什么PSYoungGen已经使用了大约1000k空间

jdk 8运行空main函数,为什么PSYoungGen已经使用了大约1000k空间

哔哔one 2023-08-04 14:42:23
当我运行一个空的 main 函数并打印 gc 详细信息时,但看到 PSYoungGen 使用了大约 1000k 空间,我没有分配任何对象,为什么它已经使用了大约 1000k 空间?代码如下:public class Test {    public static void main(String[] args) {    }}GC详细信息如下(可以看到使用的1374K):Heap PSYoungGen      total 2048K, used 1374K [0x00000007bfd80000, 0x00000007c0000000, 0x00000007c0000000)  eden space 1536K, 89% used [0x00000007bfd80000,0x00000007bfed7ba0,0x00000007bff00000)  from space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000)  to   space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000) ParOldGen       total 5632K, used 0K [0x00000007bf800000, 0x00000007bfd80000, 0x00000007bfd80000)  object space 5632K, 0% used [0x00000007bf800000,0x00000007bf800000,0x00000007bfd80000) Metaspace       used 2914K, capacity 4496K, committed 4864K, reserved 1056768K  class space    used 319K, capacity 388K, committed 512K, reserved 1048576Kvm选项如下:-Xms8m -Xmx8m -XX:+PrintGCDetails
查看完整描述

1 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

您看到的内存使用情况是 JVM 本身用来维持其工作的。如果您-verbose在运行应用程序时提供选项,您将看到许多类被加载到元空间中:


(在我的 JVM 上加载的类)


[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.String from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.reflect.AnnotatedElement from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.reflect.GenericDeclaration from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.reflect.Type from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.Class from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.Cloneable from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.ClassLoader from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.System from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]

[Loaded java.lang.Throwable from C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar]


                                            ...


                                    and many many more

它们具有静态字段,其中的对象在堆中分配,这些对象消耗内存。


并且不要忘记内部 JVM 服务,例如 GC、JMX 和 RMI,它们也可以隐式实例化并消耗一些内存。


PS 如果您想获取更多关于到底加载到堆中的内容以及每个对象消耗多少内存的信息,您可以使用任何分析实用程序(例如 VisualVM)检查 JVM 堆转储。


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信