java 检查内存溢出_使用jvisualvm.exe工具查看java项目内存溢出(堆溢出)--制造内存溢出...

在查看内存溢出的时候,我们需要明白,堆溢出和持久代溢出,他们不一样,说到内存泄漏,我们就需要明白,内存中  年老代和新生代,和持久代,这3块的数据

00c9ae19d5f6577d32fa826b3468a2bc.png

自己的理解:

new了一个对象,会进入到堆里面,先放到年轻代中 也就是new generation ,他放到eden中,如果eden满了,就会进行一次yong gc ,如果还有存活对象(被用到的对象)就会被移到S0区或者S1中转移,如果s0和S1都已经满了,那么这些对象(引用)就会把放到年老代中去,也就是old  generation 区,

如果old区,也满了,也会GC一次,也就是FGC,也就是fullGC,如果fullGC一次,就在也不接受新new的对象,往里面存储3如果fullGC,5分钟拒绝服务,jvm拒绝工作,那么5分钟类都没办法使用,所以fullGC时间要短,次数要少。

持久代:当perm里面满了,也会存在fgc,在perm里面存储的是类对象

如果还没有不懂内存溢出,大家应该懂这个现象:超时,不进行服务,服务挂掉,接口不在服务这样的异常问题,这样的问题可能是内存溢出造成的。

1.制造内存泄漏的代码

import java.util.ArrayList;

import java.util.List;

public class test2 {

public static void main(String[] args) {

int size=1024 * 1024 *8; #1MB=1024KB=1024*1024B=1024*1024*8b

List list =new ArrayList();

for (int i=0;i<1024;i++){

System.out.println("JVM 写入数据"+(i+1)+"M");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

list.add(new byte[size]); #每一秒就往堆中写入一个数据

}

}

}

2.使用jdk 自带的工具  jvisualvm.exe 查看内存泄漏

我工具的存放路径为:C:\Program Files (x86)\Java\jdk1.8.0_131\bin

执行我的程序,查看visual GC

a79985c071fcb0b83b8df8197af4628f.png

你会发现eden中数据,然后慢慢的移动到old,

e4aaec251c2efd6ef3674c245ccb3be6.png

1f11a8b947768026e4ddff057d1b5c50.png

当你内存泄漏了,old 也就满了,在监视中也可以看到,看到堆是一个阶梯式上升,因为我们程序就是每次都往堆中放入1M的数据,直至它内存满

a01e347aa7d2883b4dc8478b7442239d.png

我们点击“堆dump” ,就会生成一个 hpro文件,我们可以对hpro文件进行分析,分析见下一篇文章 《https://www.cnblogs.com/chongyou/p/11710339.html》

4eb5bab36408512c4877ec4d523a5f87.png

程序中,我的是在写入179M就会内存溢出,

260d0561ece844b0c846258bef3e57d0.png

如果发现自己没有visual GC,那需要去安装插件,

7162e93b6fe90721bf80b510dd5794a4.png

在可用插件中找到visual GC,因为我已经安装了,所以在已安装中

67f59f8a37eb66d4720f87178af88296.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值