- 本文内容基于
HotSpot
虚拟机
jvm中方法区的演变
版本 | 变化 |
---|---|
jdk1.6及之前 | 有永久代(Permanent generation),静态变量存放在永久代 |
jdk1.7 | 字符串常量池、静态变量移出永久代,存放在堆中 |
jdk1.8及之后 | 去除了永久代,本地内存的元空间(Metaspace)取代 |
jdk1.7中字符串常量池StringTable为什么从永久代移到堆中?
- 永久代的回收效率很低,只有full Gc才会触发,(老年代或永久代空间不足会触发full Gc)导致StringTable回收效率不高,开发中会有大量字符串被创建,放到堆里能够及时回收内存。
为什么去掉永久代?
- 永久代在jvm中,合适的大小难以确定(元空间分配在本地内存,无需考虑大小)
- 对永久代调优很困难