jvm 中的 ”永生代“

“方法区” 主要存储的信息包括:常量信息,类信息,方法信息,而且是全局共享的(多线程共享);

 

 

jvm 有多种实现方式(不同的厂商); 并不是所有的jvm 都有永生代的概念;

通常情况下, 很多人把 “方法区” 和“永生代”  对等;  换句话说,是利用“永生代”

去实现“方法区”, 这样可能导致OOM (因为“永生代”的大小是可以通过-XX:PermSize  -XX:MaxPermSize)

设置的; 但是在J9 和JRockit jvm中,方法区使用的内存上限是4G(32位系统可表示的最大范围),不

会存在该问题。

 

如果利用“永生代”实现“方法区”的垃圾收集, 主要是收集常量池和对类型进行卸载; 通常情况下,这个区域的

收集效率比较低。

一: 常量的回收比较容易

二: 类信息的回收需要满足的条件:

     1 . 该类所有的实例已经被回收,JVM中没有任何类的实例;

     2.  加载该类的ClassLoader被回收;

     3.  该类对应的java.lang.class没有地方引用

 

Note: 可以使用-verbose:class以及-XX:TraceClassLoading和-XX:TraceClassUnLoading来查看类的加载和卸载情况。

 

 

参考:

深入理解jvm

 

posted @ 2015-12-20 13:10  simkxa  阅读(578)  评论(0编辑  收藏  举报