我构建了一个示例程序,演示了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());
}
}
}
我通过在if(depth < N)
中更改N的值来运行它。这是结果;
当深度是1000
INIT = 16777216使用(16384K)= 288808(282K)致力于= 16252928(15872K)最大= 259522560(253440K) 可用内存在端15964120开始15964120 可用内存使用的初始值= 16777216(16384K)= 288808(282K)= 16252928(15872K)max =使用= 12877816(16384K)= 288808 259522560(253440K)
当深度是1500
INIT = 16777216使用(16384K)= 288808(282K)致力于= 16252928(15872K)最大= 259522560(253440K) 可用内存在开始15964120 在端可用内存15964120 INIT = 16777216 (16384K)使用的= 37470K(370K)= 16252928(15872K)最大= 259522560(253440K)
深度为6000时
INIT =使用16777216(16384K)= 288808(282K)致力于= 16252928(15872K)最大= 259522560(253440K) 可用内存在开始15964120 在端可用内存15692784 INIT = 16777216使用(16384K)= 560144(547K )致力于= 16252928(15872K)最大= 259522560(253440K) 可用内存15692784 INIT = 16777216使用(16384K)= 560144(547K)致力于= 16252928(15872K)最大= 259522560(253440K)
当深度是6500(线程“main”java.lang.StackOverflowError中的异常)
init = 16777216(16384K)used = 288808(282K )提交= 16252928(15872K)max = 259522560(253440K) 启动时的空闲内存15964120 空闲内存最后15676656 init = 16777216(16384K)used = 576272(562K)committed = 16252928(15872K)max = 259522560(253440K)
我的问题是;
- 它没有调用finalize()。它是内存泄漏吗?
- 自由内存不超过N = 1000。但是当N = 1500时,在程序结束时有两个不同的 值,即282K和370K。 这是为什么呢?
- 当N = 6500时,JVM产生错误。那么为什么最后2 try {}的语句被执行。
** **的观察,我发现,JVM开始释放记忆,当我创造大量的对象,如1-2十万。这意味着它不是内存泄漏,但GC在实际需要时开始释放内存。而且,它首先释放堆上的对象顶部,就像它先释放对象9000然后8999然后释放8998.有趣的是。 – 2012-04-26 00:53:44
观察2:即使在运行GC之后,getHeapMemoryUsage也会给出更高的使用空间。 – 2012-04-26 00:54:51
你可以看到http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java:对于Java中的内存泄漏非常有用! – Val 2012-06-16 13:02:26