本文从个人理解方面出发,如有不同意见,敬请提出,多多指教。
jdk 1.7 之前 实现方法区的方式是永久代(PermGen)。永久代和堆相互隔离。
jdk 1.7时: 存储在永久代的部分数据就已经转移到 Java Heap(堆) 或者 Native memory(本地内存)。但是 1.7的版本并没有完全移除永久代。
例如: 符号引用(Symbols)转到 Native memory;
字符串常量(interned Strings) 转到 Java Heap静态变量(class statics variables )转移到了Java heap
jdk 1.8 虽然还保留了方法区的概念,但是实现方式不同。用元空间 (MetaSpace,使用的是本地内存 ,并不在虚拟机上)永久的代替代了永久代。和堆也是不相连。
为什么移除永久代?
(1)字符串存在永久代中,容易出现性能问题和内存溢出
(2)永久代大小不容易确定. PermSize指定了大小容易造成OOM(内存用完)
(3)给 GC(垃圾回收机制) 带来不必要的复杂度,且回收效率低
拓展:
GC是什么?https://blog.csdn.net/wy965874100/article/details/78592094
OOM是什么?
https://www.cnblogs.com/ThinkVenus/p/6805495.html感谢以上网友的知识分享。谢谢
网友评论