Сборка мусора JVM и архитектура памяти подкачки - PullRequest
16 голосов
/ 14 мая 2009

За последние 10 лет, когда обсуждались java и / или сборка мусора, единственное ухудшение производительности, которое я не смог отстоять, - это то, что алгоритмы сборки мусора более или менее прерываются при работе в архитектуре постраничной памяти, а также в куча выгружается.

Системы Unix (и особенно Linux) агрессивно распределяют память, которая не была затронута какое-то время, и, хотя это хорошо для вашего обычного приложения c утечкой, это убивает производительность javas в ситуациях с нехваткой памяти.

Я знаю, что лучше всего хранить максимальную кучу меньше физической памяти. (Или вы увидите, что ваше приложение поменяется на смерть), но идея - по крайней мере, в мире Unix - в том, что память лучше использовать для кеширования файловой системы и т. Д.

Мой вопрос: Существуют ли какие-либо пейджинговые (осведомленные) алгоритмы сбора мусора?

Ответы [ 5 ]

9 голосов
/ 14 мая 2009

Я собираюсь утверждать, что это не такая большая проблема, как вы думаете.

Чтобы убедиться, что мы описываем одно и то же: полная коллекция требует, чтобы JVM прошла по графу объектов, чтобы идентифицировать каждый достижимый объект; те, что остались, - мусор. При этом он будет касаться каждой страницы в куче приложения, что приведет к попаданию каждой страницы в память, если она была выгружена.

Я думаю, что это не является проблемой по нескольким причинам: во-первых, потому что современные JVM используют сборщики поколений, и большинство объектов никогда не выходят из молодых поколений, которые почти гарантированно будут в резидентном наборе.

Во-вторых, потому что объекты, которые выходят из молодого поколения, все еще имеют тенденцию часто посещаться, что снова означает, что они должны быть в резидентском множестве. Это более сомнительный аргумент, и на самом деле существует множество случаев, когда долгоживущие объекты не будут затронуты, кроме как с помощью GC (одна из причин, по которой я не верю в кэши с ограниченной памятью).

Третья причина (а может быть и больше) состоит в том, что JVM (по крайней мере, Sun JVM) использует компактный коллектор с меткой-развертки. Таким образом, после GC активные объекты в куче занимают меньшее количество страниц, снова увеличивая RSS. Между прочим, это является основным драйвером для приложений Swing для явного вызова System.gc (), когда они свернуты: сжимая кучу, меньше поменяться местами, когда они снова максимизируются.


Кроме того, следует признать, что фрагментация кучи объектов C / C ++ может стать экстремальной, и молодые объекты будут разбросаны среди более старых, поэтому RSS должен быть больше.

5 голосов
/ 11 октября 2010

Вы правы, сборщик мусора и менеджер виртуальной памяти должны сотрудничать, иначе сборщик мусора поглотит систему. Такое сотрудничество между GC и ядром было исследовано Мэтью Херцем, Йи Фенгом и Эмери Д. Бергером. Чтобы получить хорошую производительность, им пришлось немного расширить ядро, а также настроить сборщик мусора.

В условиях высокой нагрузки на память тест GenCS Java GC длился примерно в 160 раз дольше. С новым GC, поддерживающим страницы, тест был только в 1,6 раза медленнее. Другими словами, при правильно настроенном ГХ увеличение производительности увеличивается в 100 раз.

http://lambda -the-ultimate.org / узел / 2391

4 голосов
/ 14 мая 2009

Системы Unix (и особенно Linux) агрессивно распределяют память, которая не была затронута какое-то время, и, хотя это хорошо для вашей средней утечки c приложениями, она убивает производительность javas в ситуациях с нехваткой памяти.

Имейте в виду, что это обычно настраиваемый параметр - например, vm.swappiness для ядра Linux. Вы можете прочитать статью в блоге, которую я написал для этого , если вы хотите получить более подробную информацию о настройке подкачки в Linux.

Существуют ли какие-либо пейджинговые (осведомленные) алгоритмы сбора мусора?

Алгоритмы сбора мусора, как правило, предназначены для очень широкого спектра возможных программ в качестве входных данных и для работы в большом количестве возможных сред; их дизайн должен принимать это во внимание. Я думаю, что было бы действительно сложно создать «пейджинговый» алгоритм gc, который был бы в целом полезен. Если бы вы писали один для очень специализированной среды, где вы могли бы заблокировать вещи, то, я думаю, у вас был бы довольно хороший шанс получить хороший результат.

4 голосов
/ 14 мая 2009

Я не эксперт, но любой вид сбора мусора поколений должен несколько помочь. Страницы, которые агрессивно меняются местами, скорее всего, содержат более старые объекты, чем более новые, поэтому gc естественным образом будет касаться их реже.

Я бы также задал встречный вопрос: существуют ли какие-либо алгоритмы подкачки Unix, которые поддерживают сборку мусора? Если определенная страница регулярно (если не часто) перетаскивается в память, то, возможно, это не такой уж и хороший кандидат, чтобы отказаться от него в пользу увеличения дискового кэша; -)

0 голосов
/ 14 мая 2009

В наше время пейджинговые программы - действительно плохая идея. Память очень дешевая.

FWIW, если вы работаете на ПК от производителя, которому нравится несколько раз взимать плату за использование памяти, Windows Vista имеет прогностический алгоритм разбиения по страницам, который работает довольно хорошо (возможно, единственная вещь, которая хорошо работает ОС).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...