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

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

自己的理解:

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<byte[] > list =new ArrayList<byte[]>();
		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)Javajdk1.8.0_131in

执行我的程序,查看visual GC

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

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

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

 

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

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

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

原文地址:https://www.cnblogs.com/chongyou/p/9681868.html