方法区内存溢出怎么处理?

在 Java 虚拟机中,方法区是可供各线程共享的运行时内存区域。

在不同的 JDK 版本中,方法区中存储的数据是不一样的:

  • JDK 1.7 之前的版本,运行时常量池是方法区的一个部分,同时方法区里面存储了类的元数据信息、静态变量、即时编译器编译后的代码等。
  • JDK 1.7 开始,JVM 已经将运行时常量池从方法区中移了出来,在 JVM 开辟了一块区域存放常量池。

永久代就是 HotSpot 版的 Java 虚拟机对虚拟机规范中方法区的一种实现方式,永久代和方法区的关系就像 Java 中类和接口的关系。

HotSpot 版的 Java 虚拟机在 JDK 1.8 之后取消了永久代,改为元空间,类的元信息被存储在元空间中。元空间没有使用堆内存,而是与堆不相连的本地内存区域。所以,理论上系统可以使用的内存有多大,元空间就有多大,所以不会出现永久代存在时的内存溢出问题。

在 jdk 1.7 及之前版本出现内存溢出的处理办法:

  • 检查代码中是否出现死循环
  • 是否创建了过多或过大的对象
  • 是否出现死锁现象
  • 提高 jvm 堆内存大小的配置

【Java面试题与答案】整理推荐

发布了539 篇原创文章 · 获赞 1512 · 访问量 161万+

猜你喜欢

转载自blog.csdn.net/meism5/article/details/105173593