39

问答题 39 /120

Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

参考答案

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含:
  • 类的方法(字节码...)
  • 类名(Sring对象)
  • .class文件读到的常量信息
  • class对象相关的对象列表和类型列表 (e.g., 方法对象的array).
  • JVM创建的内部对象
  • JIT编译器优化用的信息