jvm对对内存进行的分析

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

1.首先我们在我们的服务其上找到我们java服务的pid;
在这里插入图片描述

2.我们找到之后输入jmap -heap,得到我们对内存的使用情况
在这里插入图片描述

3.分析
MinHeapFreeRatio=n --------------使用率小于 n 的情况下 ,heap 进行收缩

MaxHeapFreeRatio = m---------------使用率大于m 的情况下 ,heap 进行扩张

MaxHeapSize --------------最大堆内存

NewSize 新生代内存大小
MaxNewSize 新生代最大尺寸
OldSize 老年代尺寸
NewRatio eden占比
SurvivorRatio Survivor占比
------------Eden区和Survivor区带都处于新生代中。
MetaspaceSize = 21807104 (20.796875MB)

下面就来分析一下内存新生代和老年代的使用情况:

1.所有通过new创建的对象都分配在堆中分配,可以使用-Xmx和-Xms控制,一个是memory max(Xmx) 一个是memory start (Xms)。
Xmx代表程序最大可以从操作系统中获取的内存数量,Xms代表程序启动的时候从操作系统中获取的内存数量。
堆被划分为新生代和旧生代,新生代又被划分为eden区和Survivor区。
Survivor区又被划分为from和to两个。
在这里插入图片描述
一个对象的创建会被划分到eden区,当第一次gc之后,如果对象还存活下来,就会被移动到survivor区,每次进行gc,对象的年龄就会增加一,当达到一定的阈值时,对象就会被移动到old老年带。
因为新生代的对象经常被gc回收掉,所以采用的gc算法一般是复制算法。复制算法的思想是:将内存分为两个区域,from和to,每次只用一块区域,当一块区域的内存用完,就将还存活的对象复制到另一块区域中,复制算法不会产生内存碎片。
对象创建的时候只会存在与eden区和from区,to区是空的,进行gc时,eden所有存活的对象都会复制到to区,而from区中的对象,会根据他们的年龄决定他们的去向:年龄达到一定阈值的对象会复制到老年代old,没有达到的对象会复制到to区。经过这次gc,eden区的对象和from区的对象就全部清空。之后,gc后空的from区现在转变为to区,gc后复制对象进去的to区转变为from区,再次等待下次gc。总之,to区永远时空的。知道转换前的to区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

猜你喜欢

转载自blog.csdn.net/han1196639488/article/details/82899160