Я строю образец программы демонстрируют утечку памяти в 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 в if(depth < N)
. Вот результат;
когда глубина 1000
INIT = 16777216 (16384K) используется = 288808 (282K), совершенные = 16252928 (15872K) макс = 259522560 (253440K) Свободная память в запуске 15964120 свободной памяти в конце 15964120 init = 16777216 (16384K) used = 288808 (282K) совершил = 16252928 (15872K) max = 259522560 (253440K) Свободная память 15964120 init = 16777216 (16384K) used = 288808 (282K) commit = 16252928 (15872K) max = 259522560 (253440K)
, когда глубина 1500
INIT = 16777216 (16384K) используется = 288808 (282K), совершенные = 16252928 (15872K) макс = 259522560 (253440K) Свободная память в запуске 15964120 свободной памяти в конце 15964120 INIT = 16777216 (16384K) используется = 288808 (282K) совершено = 16252928 (15872K) max = 259522560 (253440K) Свободная память 15873528 init = 16777216 (16384K) used = 379400 (370K) commit = 16252928 (15872K) max = 259522560 (253440K)
, когда глубина составляет 6000
INIT = 16777216 (16384K) используется = 288808 (282K), совершенные = 16252928 (15872K) макс = 259522560 (253440K) Свободная память в запуске 15964120 свободной памяти в конце 15692784 INIT = 16777216 (16384K) используется = 560144 (547K) совершенные = 16252928 (15872K) макс = 259522560 (253440K) Free Memory 15692784 INIT = 16777216 (16384K) используется = 560144 (547K), совершенные = 16252928 (15872K) макс = 259522560 (253440K)
, когда глубина 6500 (Исключение в потоке «главный» java.lang.StackOverflowError)
init = 16777216 (16384K) used = 288808 (282K)) commit = 16252928 (15872K) max = 259522560 (253440K) Свободная память при запуске 15964120 Свободная память в конце 15676656 init = 16777216 (16384K) использовано = 576272 (562K) значение = 16252928 (15872K) max = 259522560 (253440K)
Мои вопросы:
- Это не звонок finalize(). Это утечка памяти?
- В свободной памяти не изменяется до N = 1000. Но когда N = 1500, то есть 2 разных значения для используемой памяти в конце программы, то есть 282K и 370K. Почему это так?
- При N = 6500 JVM генерирует ошибку. Итак, почему последние 2 утверждения try {} выполнены.
** ** Наблюдение, я обнаружил, что J начнут выпускать когда я создаю огромное количество объектов, например, 1-2 лакхов. Это означает, что это не утечка памяти, но GC начинает выпускать память, когда она действительно нужна. Кроме того, он высвобождает верхнюю часть объекта в куче, так как сначала он отбрасывает объект 9000, затем 8999, затем 8998. интересно. –
Наблюдение 2: даже после запуска GC, getHeapMemoryUsage дает более высокое используемое пространство. –
Вы можете увидеть http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java: действительно полезно для утечек памяти в Java! – Val