方法区 永久代 元空间 常量池

方法区:jvm标准

永久代:hotspot实现 1.7

元空间:hotspot实现 1.8

 

首先,metaspace默认的最大值是整个机器的物理内存大小,所以metaspace不断扩张会导致java程序侵占系统可用内存,最终系统没有可用的内存;而永久区则有固定的默认大小,不会扩张到整个机器的可用内存。当分配的内存耗尽时,两者均会触发full gc,但不同的是永久区在full gc时,以堆内存回收时类似的机制去回收永久区中的类元数据(Class对象),只要是根引用无法到达的对象就可以回收掉,而metaspace判断类元数据是否可以回收,是根据加载这些类元数据的Classloader是否可以回收来判断的,只要Classloader不能回收,通过其加载的类元数据就不会被回收。

原文链接:https://blog.csdn.net/xyghehehehe/article/details/78820135

 

常量池

1.6  - 永久代(方法区)

1.7、1.8  - 堆

 

但是即使是同样在堆中:

public class StringConstancePool {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = str1.intern();
System.out.println(str1 == str2);
}
}
以上程序的运行结果仍然是false,这时因为intern生成的str2所引用的字符串内容是在字符串常量池中,而通过new String方法生成的str1,该字符串对象是位于存放对象的Java堆中,二者的地址是不同的。

原文链接:https://blog.csdn.net/MustangJy/article/details/88044964

posted on 2019-09-18 17:03  silyvin  阅读(558)  评论(0编辑  收藏  举报