Edit:
Нет утечки памяти, просто недоразумение, что мне говорит Netbeans Profiler. Результаты прямого профилирования -> Выделенные объекты относятся к ОБЩЕМУ, выделенному за время существования программы, а не к общему количеству, которое в настоящее время находится в памяти. За это получите кучу дампов. Извините за путаницу, но, возможно, кто-то еще найдет это, и это прояснит это для них.
Я использую профилировщик NetBeans 7.0.1 для устранения проблем с ростом памяти в моем приложении и вижу две основные проблемы. Я успешно создал тестовые приложения и вижу те же результаты в профилировщике, включенном ниже. Я не смог найти ссылку на них где-либо еще.
Случай 1: при циклическом просмотре набора записей HashMap объект java.util.HashMap & EntryIterator увеличивается. Есть ли здесь что-нибудь, кроме как найти решение с другим контейнером? Каждому приложению необходим циклический просмотр коллекции каждый раз в цикле while.
public static void main(String[] args) throws InterruptedException {
boolean run = true;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer> ();
map.put(1, 2);map.put(3, 4);map.put(5, 6);map.put(7, 8);
while(true){
for (Entry<Integer, Integer> entry : map.entrySet()) {
Integer i = entry.getValue();
}
//app specific code here
Thread.sleep(50);
}
}
Случай 2. Создание пустых списков ArrayLists в цикле приводит к росту java.lang.Object []. Я ожидаю, что ArrayLists будет иметь право на GC в конце цикла while. Мое предположение неверно? Или здесь что-то еще играет?
public static void main(String[] args) throws InterruptedException {
boolean run = true;
while(run){
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
// app specific code here
Thread.sleep(50);
}
}