1. 说明
- 1.在HotSpot虚拟机中,方法区(Method Area)的演进是一个重要的内存管理优化过程。
- 2.从JDK1.6到JDK1.8,HotSpot虚拟机中的方法区经历了从永久代到元空间的重大变化。
- 3.这一变化反映了虚拟机内存管理的优化和适应性改进。
- 4.通过移除永久代并引入元空间,虚拟机提高了内存使用的灵活性和效率,同时降低了内存管理的复杂性。
- 5.开发者仍然需要注意元空间的使用情况,以避免因元空间不足而导致的系统内存问题。
- 6.jdk6/7中:XX:PermSize=10m -XX:MaxPermSize=10m
- 7.jdk8中:-XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m
2. JDK1.6及以前
- 1.实现:在JDK1.6及之前的版本中,方法区通常被称为永久代(permanent generation)。
- 2.存储内容:永久代用于存储静态变量、类型信息、运行时常量池、JIT(即时编译器)代码缓存等。
- 3.内存管理:永久代的内存管理类似于Java堆,但回收效率较低,通常只在Full GC时触发。
3. JDK1.7
- 1.去永久代:JDK1.7开始逐步“去永久代”的过程。
- 2.变化:字符串常量池和静态变量被从永久代中移除,转而存储在Java堆中。这一变化提高了字符串的回收效率,因为Java堆的内存管理更加灵活和高效。
- 3.遗留问题:尽管进行了这些更改,但永久代仍然存在于JDK1.7中,只是其内容和作用有所减少。
4. JDK1.8及以后
- 1.完全移除永久代:在JDK1.8中,永久代被完全移除,取而代之的是元空间(Metaspace)。
- 2.元空间:元空间是一个与堆不相连的本地内存区域,用于存储类的元数据信息(如类型信息、字段、方法等)。由于元空间使用本地内存,其最大可分配空间受限于系统可用内存。
- 3.优势:元空间的引入解决了永久代内存管理困难的问题,提高了内存使用的灵活性和效率。同时,由于元空间不在虚拟机内存中,因此不会受到虚拟机内存大小的限制。
- 4.内存管理:元空间的内存管理相对简单,当元空间不足时,可以通过增加本地内存或优化类的加载和卸载来解决问题。然而,如果元空间使用过多,仍然可能导致系统内存不足的问题,此时虚拟机将抛出OutOfMemoryError异常。