在 Java 虚拟机中,方法区是可供各线程共享的运行时内存区域。
在不同的 JDK 版本中,方法区中存储的数据是不一样的:
- JDK 1.7 之前的版本,运行时常量池是方法区的一个部分,同时方法区里面存储了类的元数据信息、静态变量、即时编译器编译后的代码等。
- JDK 1.7 开始,JVM 已经将运行时常量池从方法区中移了出来,在 JVM 开辟了一块区域存放常量池。
永久代就是 HotSpot 版的 Java 虚拟机对虚拟机规范中方法区的一种实现方式,永久代和方法区的关系就像 Java 中类和接口的关系。
HotSpot 版的 Java 虚拟机在 JDK 1.8 之后取消了永久代,改为元空间,类的元信息被存储在元空间中。元空间没有使用堆内存,而是与堆不相连的本地内存区域。所以,理论上系统可以使用的内存有多大,元空间就有多大,所以不会出现永久代存在时的内存溢出问题。
在 jdk 1.7 及之前版本出现内存溢出的处理办法:
- 检查代码中是否出现死循环
- 是否创建了过多或过大的对象
- 是否出现死锁现象
- 提高 jvm 堆内存大小的配置