jdk 1.8 方法区变动

2019-04-11  本文已影响0人  南土酱

本文从个人理解方面出发,如有不同意见,敬请提出,多多指教。

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

感谢以上网友的知识分享。谢谢

上一篇下一篇

猜你喜欢

热点阅读