5分钟直观了解JAVA内存泄露

1.一段简短的内存泄露代码

通常我们可能都听说过内存泄露这个概念,但有些初学者可能却反对内存泄露的直观认识,下面对此进行简要介绍

/*
	fileName:   memoryLeak.java
	author:     jack hu
	date  :     2017-4-5 
	copyright:  仅用于学习目的,转载请注明
*/

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class memoryLeak {
	public static void main(String[] args){
		System.out.println("Start demo.....");
		
		List<int[]> theList = new ArrayList<int[]>(); //存放首地址
		
		
		Runtime run = Runtime.getRuntime();
		InputStream in = System.in;
	    int ch = 'a';
	    while (ch != '@'){  // 输入@则停止while 循环
	    		try {
	    			ch = in.read();
	    			int[] arr = new int[1024 * 1024]; //申请1M的内存
	    			
	    			 theList.add(arr); //加入theList
	    				    			
	    		}catch (Exception e){
	    			e.printStackTrace();
	    		}
	    }
	}
}


上面这段简短的代码  先创建一个数组,然后从屏幕上读取字符,直到遇到'@’ 则停止,在while 内部,每次申请1M的内存

由于在while 循环中 每次申请1M的内存,并将内存首地址的引用保存在theList, 内存得不到释放的机会,因而发生了内存泄露,我们可以通过jvsiualvm 工具来查看这个过程


2. 编译&运行

javac  memoryLeak.java
java  memoryLeak


从命令输入 jvsiualvm , 运行jvsiualvm



不停的申请内存,可以看到堆内存在不停的增长


由于我们不停的申请内存,最终发生outofmemory







猜你喜欢

转载自blog.csdn.net/a_bcd_123/article/details/69230385