JVM(7)之 从GC日志分析堆内存

Stella981
• 阅读 428

在前面的文章中,我们只设置了整个堆的内存大小。但是我们知道,堆又分为了新生代,年老代。他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西。因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存。 
  首先我们来了解几个相关的参数:

  • -XX:+PrintGCDetails:用于告诉虚拟机回收垃圾的时候顺便打印日志
  • -Xloggc:路径 :将打印出来的日志信息保存至指定的路径
  • -Xmn10M:设置新生代的内存大小
  • -XX:SurvivorRatio=8:1调整Eden和Survivor的比例为8:1

  我们还是用前面的代码例子来讲: 
JVM(7)之 从GC日志分析堆内存  
  然后用参数-Xms20m -Xmx20m -Xmn10 
-XX:+PrintGCDetails -Xloggc:d:\gc1.log启动。表示给堆分配20M,给新生代分配10M,打印GC日志,并将其输出至D盘的gc1.log文件中。运行后得到以下日志,这是第一部分: 
JVM(7)之 从GC日志分析堆内存  
  现在我们来分析下每个部分代表的含义:

  • 1)0.090:就是虚拟机从启动到现在经历的时间。
  • 2)GC:指的是停顿类型(留着下一章讲)
  • 3)PSYoungGen:发生GC的区域,这里指的是年轻代。根据收集器的种类而定。
  • 4)7284K->1016K(9216K):该区域GC前当前区域所使用的容量–>该区域GC后已使用的容量(该区域的总容量),也就是新生代的容量。
  • 5)7284K->6139K(19456K):整个堆GC前当前区域所使用的容量–>整个堆GC后已使用的容量(整个堆的总容量)。
  • 6) 0.0078481:这次GC所占用的时间。

  我们再来看看第二部分: 
JVM(7)之 从GC日志分析堆内存  
  看图画红线部分,表示当前的堆中新生代可用内存的大小(一个eden和一个Survivor视为可用内存),红色框下面则是年老区的大小,加上一共是20m,符合我们所设置的。 
  红色框的部分则是新生代中eden区和两个Survivor区的大小,可以看出他们的比例是8:1,如果设置为-XX:SurvivorRatio=3的话,结果如下 
JVM(7)之 从GC日志分析堆内存  
  到这里以上几个参数的作用以及分析就讲完啦,小伙伴们可以打开自己的工具试一试,感受一下。以后碰到了内存泄漏或者内存不足的话就可以直接查看日志来进行分析调优了!

点赞
收藏
评论区
推荐文章
秋招面试我去了拼多多,直接被问JVM&GC底层原理和算法,我吊打面试官
(https://shimo.im/docs/9GTP6XrJg9J88cJD/)JVM常用参数设置积累c堆的初始值,默认物理内存的1/64Xms:堆的最大值,默认物理内存的1/4Xmx:年轻代大小「在整个堆内存大小确定的情况下,增大年轻代将会减小年老代,反之亦然。此值关系到JVM垃圾回收,对系统性能影响较大,官方推荐配置为整个堆大小的3/8」X
Stella981 Stella981
2年前
JVM(6):JVM 调优
JVM(6):JVM调优从Eclipse开始来源:纯洁的微笑,www.cnblogs.com/ityouknow/p/5647513.html概述什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配、回收的情况来调整各区域内存比例或者gc回收的策略;更深一层就是根据dump出来的内存结构和线程栈来
Wesley13 Wesley13
2年前
Java虚拟机堆内存(新生代)
Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在Java中,堆被划分成两个不同的区域:新生代,老年代。新生代又被分为了三个区域:Eden,from survivor,tosurvivor。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存分配以及回收。堆的内存模型大致为:从图中可以看出:堆大
Stella981 Stella981
2年前
JVM基本配置与调优
JVM基本配置与调优JVM调优,一般都是针对堆内存配置调优。如图:堆内存分新生代和老年代,新生代又划分为eden区、from区、to区。!(https://oscimg.oschina.net/oscnet/5b30ad2de1851315e10f5d9e0a57395208c.png)一、区域释义
Stella981 Stella981
2年前
JVM调优
概述  什么是jvm调优呢?jvm调优就是根据gc日志分析jvm内存分配、回收的情况来调整各区域内存比例或者gc回收的策略;更深一层就是根据dump出来的内存结构和线程栈来分析代码中不合理的地方给予改进。eclipse优化主要涉及的是前者,通过gc日志来分析。本文主要是通过分析eclipsegc日志为例来示例如何根据gc日志来分析jvm内存而进
Stella981 Stella981
2年前
JVM 调优
JVM堆内存分区堆:年轻代,老年代,持久代年轻代:Eden,Survivor1,Survivor2!一个性能较好的jvm参数配置以及jvm的简介(http://static.oschina.net/uploads/img/201601/13172230_Pd5L.jpg)GC新生代GC(Mino
Stella981 Stella981
2年前
JVM笔记九
在上一篇文章中,我们通过代码运行结果,查看到JVM的堆内存逻辑上分区是三部分,物理上分区是2部分,以及是新生代分区三部分,占比分布是8/1/1。而且我们还通过代码和堆JVM参数配置,制造出了OOM异常。下面我们就来分析GC回收器的日志信息。先来看看,OOM后,GC详细日志信息:!dd604a3c4cda17304edcc43b03106d58.pn
Stella981 Stella981
2年前
JVM 参数学习
一、JVM1、JVM产生GC的位置Eden(新生代)MinorGC算法(复制)Oldtenure(老年代) Major(Full)GC(整理压缩)算法2、JVM堆(Heap)内存大小参数\Xmn新生代8:1:1比例\Xms设置初始化堆内存大小 \Xmx设置堆内存最大大小 产生java.lang.
Stella981 Stella981
2年前
JVM优化之
XmnXmsXmxXss有什么区别Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。\Xms堆内存的最小大小,默认为物理内存的1/64\Xmx堆内存的最大大小,默认为物理内存的1/4\Xmn堆内新生代的大小。通过这个值也可以得到老
Stella981 Stella981
2年前
JVM复习
在复习Java内存机制的过程中有一些新问题,自问自答,做个记录。新生代是java堆内存的一部分。堆内存分新生代和老生代两大块,也有把堆内存分为新生代老生代永久代(持久代)三块的说法。(不过这种说法应该逐渐被淘汰,因为从java7开始永久代就已经被移除了。)新生代继续细分,可以划分出Eden,SurvivorFrom,SurvivorTo三块,Ed