JVM入门(二)堆区域划分和垃圾回收策略

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x18094/article/details/89389644

JVM入门(二)垃圾回收策略

一、内存分配与垃圾回收相关概念

(1)堆区域划分

堆:年轻代+老年代
年轻代:1个Eden区+2个Survivor区 ,大小比例是 8:1。

对象在Eden区创建,每次只使用Eden区和一个Survivor区,这两个区满了后会放到空白区(MINOR GC)。由于98%对象朝生夕死,因此不会不够用,就算不够用也会转到老年代。

(2)年轻代

年轻代回收机制:Eden区+Survivor区满了后,将Survivor复制到另一个区,再将这个区清空。

区域中有可回收和还存活的内容,空间满了后,复制还存活的内容到另一个区,并且清空该区。

(3)年轻代和老年代转移机制

年轻代和老年代转移机制:
1.年轻代空间不够,转移到老年代。
2.年轻代中的对象有岁数属性,每当进行一次复制回收时,还存活于年轻代的对象岁数+1,默认岁数到15,转移到老年代。
可设置  -XX:MaxTenuringThreshold=15

(4)老年代回收机制

老年代回收机制:标记-清除-整理。这边都是大对象或者很难死去的对象,因此不适用年轻代的回收方法。老年代内存不足会触发垃圾收集,这个回收叫做FULL GC,默认是占用了68%后收集。
可设置 -XX:CMSInitiatingOccupancyFraction=68自行设置。

(5)堆大小

堆的大小=年轻代+老年代+持久代。持久代一般固定大小为64m。
因此增大年轻代的大小会减小老年代的空间,官方推荐为整个堆的3/8。

学完需要记住什么

  • 了解年轻代回收机制关键词:复制、清空。
  • 年轻代在什么情况下转移到老年代——岁数大。
  • 老年代回收FULL GC的概念:内存达到一定占用比触发回收。
  • 两个配置:年轻代岁数、触发GC回收的最大占用比配置。

二、利用MAT排查堆溢出

1.插件下载

eclipse下载一个MAT的插件

2.RUN VM arguments 配置

-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError指的是当发生内存溢出的时候会将当前的内存使用情况生成一个快照保存起来。

3.报告文件

出现堆栈溢出错误,项目路径下生成java_pidxxx.hprof的文件。

4.分析大对象

一般分析大对象 ——Dominator Tree: List the biggest objects and what they keep alive.
右键选择:Path To GC Root(在引用链上的路径)
再选择:exclue all phantom/weak/soft etc. reference

猜你喜欢

转载自blog.csdn.net/x18094/article/details/89389644
今日推荐