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的内存,并将内存首地址的引用保存在theList, 内存得不到释放的机会,因而发生了内存泄露,我们可以通过jvsiualvm 工具来查看这个过程
2. 编译&运行
javac memoryLeak.java
java memoryLeak
从命令输入 jvsiualvm , 运行jvsiualvm
不停的申请内存,可以看到堆内存在不停的增长
由于我们不停的申请内存,最终发生outofmemory