一起学习JVM-内存结构-方法区(Method Area)(线程共享的区域)
文章目录 方法区(Method Area) 运行时常量池 StringTable(串池) 方法区(Method Area) 定义: 存储了跟类相关的信息,如:成员变量、方法、构造器及常量池等。 逻辑上是堆的一部分,但是具体的实现是不一样的。比如:oracle公司的Hotspot JVM 在1.8之前方法区的实现叫永久代,就是使用堆的一部分作为方法区。 而1.8之后方法区的实现叫元空间,使用的是本地内存也就是系统内存。 特点: 1.所有Java线程共享的区域 2.能发生outOfMemoryErrot(内存溢出) 产生方法区内存溢出的场景: 动态产生class并加载的场景:如, spring利用cglib生成的代理类,mybatis用cglib动态生成mapper接口的实现类等 在JDK1.8之前,spring、mybatis等动态生成的类还是很容易造成永久代的内存溢出。 在1.8之后,因为元空间使用的是系统内存,相对来说充裕了很多,而且垃圾回收也是由自己管理的 演示代码: 1.8 以前会导致永久代内存溢出: 注意:该代码应用于JDK1.6版本 /** * 演示永久代内存溢出 java.lang.OutOfMemoryError: PermGen space * 设置启动参数,永久代最大内存为8M: -XX:MaxPermSize=8m */ public class Demo1_6