其他分享
首页 > 其他分享> > JVM之持久代与OutOfMemory

JVM之持久代与OutOfMemory

作者:互联网

持久代 Permanent Generation space(JDK1.7及以下版本存在) MetaSpace(JDK1.8及以上版本)

PermGen中方法区移至Metaspace,字符串常量移至Java Heap。类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。

** MetaSpace组成

**

MetaSpace主要参数 java.lang.out of memory 内存泄漏与内存溢出

先了解下内存泄漏与内存溢出的区别

out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory! JVM常见内存溢出区域 堆溢出 java.lang.OutOfMemoryError:Java heap space 堆溢出GC过程: 解决方案: 永久区内存溢出 java.lang.OutOfMemoryError:PermGen space 解决方案: out_of_memory_error_matespace 问题引发: 解决方案: 直接内存溢出 java.lang.OutOfMemoryError:allocate Memory 解决方案: 线程过多导致OOM java.lang.OutOfMemoryError: unable to create new native thread

每个线程都要占用内存空间,因此当线程数量太多时,也有可能导致OOM,由于线程的栈空间是堆外内存分配的,因此与直接内存非常相似。

问题引发: 解决方案: GC效率低下导致溢出 java.lang.OutOfMemoryError:GC overhead limit exceeded 触发条件:
  1. 花在GC上的时间是否超过了98%
  2. 老年代释放内存是否小于2%
  3. eden内存是否小于2%
  4. 以上情况同时且连续5次出现
解决办法: 遇到OOM我们应该怎么办? 最后补充一个小知识点: 浅堆(Shallow Heap)与深堆(Retained Heap)

对象的实际大小定义为一个对象所能触及的所有对象的浅堆大小之和,也就是通常意义上说的对象大小。与深堆相比,这个概念在日常中更容易被接受,但实际上这个概念和垃圾回收无关。

如图所示:对象A的实际大小为A、C、D之和,但A的深堆大小为A、D之和。

JVM之持久代与OutOfMemory

 

原文链接:https://juejin.cn/post/6931181310489100301

如果觉得本文对你有帮助,可以关注一下我公众号,回复关键字【面试】即可得到一份Java核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!

标签:OutOfMemory,java,代与,阈值,XX,GC,内存,JVM,线程
来源: https://blog.51cto.com/u_15265637/2889504