什么是持久代

之前排查问题有涉及到一些jvm的知识,之前提到的是一些基础的gc日志知识,这次接着简单分析jvm的设计原理,相信jvm的设计方法会对我们在项目设计时有些启发。

1 什么是Perm Generation?

 持久存储的jvm使用的class对象,class对象,就像其他存储在堆中的对象一样。class对象也和object对象一样被存储和gc。class对象和其他对象的关系如图。

2 为什么要把object对象和class对象分开存储?

1) 哲学原因:在软件哲学上看,class对象是jvm需要的,object对象是应用开发需要的,分开存储,应用开发就不需要关心jvm的那些对象。

2) 历史原因:在自定义class loader[3]没有流行的时代,通过观察发现class对象很少被unload,因此独立存储会减少扫描对象,提高gc的性能。

3) 目前技术原因:目前Perm Gen存在主要是并行回收器回收时需要按照对象被移动的先后顺序处理,因为处理一个对象时需要找到对象对应的class信息,而Perm Gen是先于tenured区移动的,这使得处理对象时能够准确找到对应class对象的位置。

3 永久区中有什么?

  • 类的方法(字节码...)
  • 类名(Sring对象)
  • .class文件读到的常量信息
  • class对象相关的对象列表和类型列表 (e.g., 方法对象的array).
  • JVM创建的内部对象
  • JIT编译器优化用的信息

4 参考&延伸阅读:

1) 什么是Permanent Gen:https://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

2) 各种收集器:https://blogs.oracle.com/jonthecollector/entry/our_collectors

3) ClassLoader简介:http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html

posted @ 2014-03-14 21:10  nickolas  阅读(3747)  评论(0编辑  收藏  举报