1,背景
class文件、类的加载过程。我们的class文件就要进入到JVM内存里,我们沿着经典的JDK1.6,JDK1.7,JDK1.8看看在其中都经历了哪些改变
概念的统一:
- 方法区:
方法区可以看作是JVM逻辑上管理一片区域的名字的概念 - 永久代:
永久代和元空间都是对方法区的实现,只不过是1.7以前是永久代,1.8开始永久代被替代成元空间了。 - 元空间:
2,内存模型的演变
1.6及以前JVM运行时数据区,方法区叫永久代
JVM1.7
1.7永久代还存在,但是已经逐步去永久代,字符串常量和静态变量移到堆中
JVM1.8 及以后
1.8以后,无永久代,类型信息、字段、方法、常量直接保存在元空间,元空间用的是直接内存,字符串常量池和静态常量还是保持在堆中。
思考
永久代为什么要被元空间替换?
永久代设置空间大小是很难确定的。在某些场景下,如果动态加载的类过多,容易产生OOM。或者是朝生夕死的类比较多。
对永久代的调优比较困难
字符串常量池为什么调整?
永久代的回收效率比较低,在full gc的时候才会触发。发生full gc是老年代的空间不足、永久代空间不足才会促发。这就导致stringTable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆中能及时回收。