方法区 and 元空间 详解
1.8之前
JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
1.8之后
(1.8之后取消了方法区,取而代之的是元空间,也不再使用持久代内存,而是使用本地内存)
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:
元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过以下参数来指定元空间的大小:
1.8不会出现方法区的溢出,但永久带溢出还是存在的,但是会出现元空间的溢出。
为什么要用元空间取代方法区?
1)JDK1.8之前方法区使用的是 JVM持久代内存,字符串存在永久代中,容易出现性能问题和内存溢出
2)类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
4)Oracle 可能会将HotSpot 与 JRockit 合二为一
详细参考原文:https://blog.csdn.net/lilamei170607/article/details/81429623

浙公网安备 33010602011771号