首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jdk 8运行空主函数,为什么PSYoungGen已经使用了大约1000 k空间?

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

Stack Overflow用户
提问于 2019-09-16 06:13:54
回答 1查看 75关注 0票数 4

当我运行一个空的主函数,并打印gc细节,但是看到PSYoungGen使用了大约1000 k的空间,我没有分配任何对象,为什么它已经使用了大约1000 K的空间?代码如下:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {

    }
}

GC的详细信息如下(可查看使用的1374K):

代码语言:javascript
复制
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 1048576K

vm选项如下:

代码语言:javascript
复制
-Xms8m -Xmx8m -XX:+PrintGCDetails
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-16 08:40:58

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

(装载在JVM上的类)

代码语言:javascript
复制
[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,它们也可以隐式实例化并消耗一些内存。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57951258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档