我构建了一个示例程序来演示 java 中的内存泄漏。
public class MemoryLeakTest {
static int depth = 0;
int number=0;
MemoryLeakTest mobj;
MemoryLeakTest(){
number = depth;
if(depth < 6500){
depth++;
mobj = new MemoryLeakTest();
}
}
protected void finalize(){
System.out.println(number + " released.");
}
public static void main(String[] args) {
try{
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
System.out.println("Free Memory in starting "+ Runtime.getRuntime().freeMemory());
MemoryLeakTest testObj = new MemoryLeakTest();
System.out.println("Free Memory in end "+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
catch(Exception exp){}
finally{
System.out.println("Free Memory"+ Runtime.getRuntime().freeMemory());
System.out.println(ManagementFactory.getMemoryMXBean().getHeapMemoryUsage());
}
}
}
我通过更改 N in 的值来运行它if(depth < N)
。这是结果;
当深度为 1000 时
初始化 = 16777216(16384K) 已使用 = 288808(282K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K) 开始时的可用内存 15964120 结束时的可用内存 15964120 初始化 = 16777216(16384K) 已使用 = 828 (1628829222) 15872K) 最大值 = 259522560(253440K) 可用内存 15964120 初始化 = 16777216(16384K) 已使用 = 288808(282K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K)
当深度为 1500 时
初始化 = 16777216(16384K) 已使用 = 288808(282K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K) 开始时的可用内存 15964120 结束时的可用内存 15964120 初始化 = 16777216(16384K) 已使用 = 828 (1628829222) 15872K) 最大值 = 259522560(253440K) 可用内存 15873528 初始化 = 16777216(16384K) 已使用 = 379400(370K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K)
当深度为 6000
初始化 = 16777216(16384K) 已使用 = 288808(282K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K) 开始时的可用内存 15964120 结束时的可用内存 15692784 初始化 = 16777216(16777216(16384K) 已使用 = 82145947 已提交 = 82145947 15872K) 最大值 = 259522560(253440K) 可用内存 15692784 初始化 = 16777216(16384K) 已使用 = 560144(547K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K)
当深度为 6500 时(线程“main”java.lang.StackOverflowError 中的异常)
初始化 = 16777216(16384K) 已使用 = 288808(282K) 已提交 = 16252928(15872K) 最大值 = 259522560(253440K) 开始时的可用内存 15964120 结束时的可用内存 15676656 初始化 = 16777216(16384K) 已使用 = 826(252562) (=576) 15872K) 最大值 = 259522560(253440K)
我的问题是;
- 它没有调用 finalize()。是内存泄漏吗?
- 在 N=1000 之前,可用内存没有变化。但是当 N=1500 时,程序末尾的已用内存有 2 个不同的值,即 282K 和 370K。为什么会这样?
- 当 N=6500 时,JVM 产生错误。那么为什么要执行 try{} 的最后两条语句。