Я пытаюсь получить представление о правильном использовании памяти и сборке мусора в Java. Я никоим образом не новичок-программист, но мне всегда кажется, что, когда Java коснется некоторой памяти, она никогда не будет выпущена для других приложений. В этом случае вы должны убедиться, что ваша пиковая память никогда не бывает слишком высокой, или ваше приложение будет постоянно использовать все, что пиковое использование памяти было.
Я написал небольшую пробную программу, пытающуюся это продемонстрировать. Он в основном имеет 4 кнопки...
- Заполните область видимости класса
BigList = new ArrayList<string>()
примерно с 25 000 000 длинными строковыми элементами. - Вызов
BigList.clear()
- Повторно перенастройте список -
BigList = new ArrayList<string>()
(чтобы уменьшить размер списка) - Вызов
System.gc()
- Да, я знаю, это не означает, что GC действительно будет работать, но это то, что у нас есть.
Итак, я провел некоторое тестирование в Windows, Linux и Mac OS при использовании мониторов задач по умолчанию, чтобы проверить использование записанных сообщений о процессах. Вот что я нашел...
- Windows. Накачка списка, вызов clear, а затем вызов GC несколько раз не уменьшит использование памяти. Однако перераспределение списка с помощью
new
и последующее вызов GC несколько раз уменьшит использование памяти до начальных уровней. ИМО, это приемлемо. - Linux (я использовал дистрибутив Mint 11 с Sun JVM) - Те же результаты, что и Windows.
- Mac OS. Я выполнил шаги sames, как описано выше, но даже если повторная инициализация вызовов списков в GC, похоже, не имеет никакого эффекта. Программа будет работать с сотнями МБ ОЗУ, хотя я ничего не имею в памяти.
Кто-нибудь может мне это объяснить? Некоторые люди рассказали мне кое-что о памяти "кучи", но я до сих пор не совсем понимаю это, и я не уверен, что это применимо здесь. Из того, что я слышал об этом, я не должен видеть поведение, которое я нахожу в Windows и Linux, в любом случае.
Разве это просто разница в том, как Mac OS Activity Monitor измеряет использование памяти или что-то еще происходит? Я бы предпочел, чтобы моя программа не работала на больших объемах использования ОЗУ. Спасибо за понимание.