之前排查问题有涉及到一些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