Изтичане на памет. Как правилно да се обадите на Garbage Collector

Основи на Java

12 фев 2013 02:56

Добър ден. Никога не съм мислил как работи Garbage Collector, докато не ми се наложи. При нужда разбрах, че не мога да го принудя да изчисти паметта (изтрие несъществуващи връзки). Ето прост пример: изпълняване на приложението при отстраняване на грешки: Преди цикъла, който създава 17M . препратки към обекти и пълнени в колекцията, зададох точка на прекъсване. Преди цикъла приложението заема 80 000 KB - това вече е много, но ще си затварям очите за това, т.к. в приложението дори преди цикъла се създават много препратки към обекти, използва се хибернация и т.н. обекти. След това се опитваме да изчистим паметта: 1. Изчистване на колекцията чрез извикване на objectList.clear() - не помага, все още GIG. 2. Ние напълно унищожаваме препратката към колекцията objectList = null; - не помага, все още GIG. 3. Опитваме се да извикаме Garbage Collector насила - System.gc() - 8KB се освобождават при едно извикване - но това е много малко, като се има предвид, че едно извикване на System.gc() отнема цели 0,1 сек. 4. Извикваме System.gc () в цикъл 100, 200, 300, 1000 пъти - не помага. Не само това, трябва да изчакате цели 10 секунди. за 100 разговора и паметта не е изчистена до първоначалния си размер. Мениджърът показва 850 000 KB - това е много.

Някой може ли да даде съвет как бързо да изчистите паметта до първоначалната начална точка - 80 000 KB? И възможно ли е по принцип?

Променено: 11 февруари 2013 19:57
12 фев 2013 03:16 ч
Променено: 11 февруари 2013 20:20
12 фев 2013 04:23
12 фев 2013 14:33

Това е нищо. 80Mb - това приложение не е доризагрят.

Никакви извиквания към System.gc() няма да стартират колектора. Те само препоръчват системата да го направи. Това е първото. Второ. И кой ти каза, че след събирането на боклука процеса ще даде памет на СИСТЕМАТА? Паметта може да бъде освободена и върната в купчината. Но купчината ще остане със същия размер. Защо VM ще го върне, ако знае, че паметта току-що е била използвана? Повторното питане на системата е скъпо. Така че това, което виждате в диспечера, изобщо не е индикатор. Трябва да погледнете параметрите на Runtime - maxMemory, freeMemory, totalMemory.

Е, първата опция е да покажете кода, с който се опитвате да го тествате.