Как уменьшить внутренние накладные расходы на солнце/Oracle JVM?
Вопрос
Эта проблема специально о Sun Java JVM работает на Linux X86-64. Анкет Я пытаюсь выяснить Почему Sun JVM принимает так много физической памяти системы, даже когда я устанавливал кучу и не HAP-ограничения.
Программа, которую я запускаю, - это Eclipse 3.7 с несколькими плагинами/функциями. Наиболее используемыми функциями являются PDT, Egit и Mylyn. Я начинаю затмение со следующих коммутаторов командной строки:
-nosplash -vmargs -Xincgc -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -XX:MaxPermHeapExpansion=10m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=5 -XX:GCTimeRatio=49 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=1000 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+AggressiveOpts -Dorg.eclipse.swt.internal.gtk.disablePrinting
Стоит отметить, что особенно переключатели:
-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m
Эти переключатели должен ограничить кучу JVM максимум 200 МБ и не-HEAP до 150 МБ («CMS постоянное поколение» и «Кэш кода», как помечен JConsole). Логически, JVM должен взять в общей сложности 350 МБ плюс внутренние накладные расходы, требуемые JVM.
В действительности, JVM берет 544,6 МБ Для моего текущего процесса затмения, вычисленного по ps_mem.py (http://www.pixelbeat.org/scripts/ps_mem.py), который вычисляет реальные страницы физической памяти, зарезервированные ядром Linux 2.6+. Это внутреннее солнце JVM накладные расходы в 35% или примерно 200 МБ!
Есть намеки на то, как уменьшить эту накладную расходы?
Вот некоторая дополнительная информация:
$ ps auxw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
me 23440 2.4 14.4 1394144 558440 ? Sl Oct12 210:41 /usr/bin/java ...
И, согласно JConsole, процесс использовал 160 МБ кучи и 151 МБ не HEAP.
Я не говорю, что не могу позволить себе использовать дополнительные 200 МБ для запуска Eclipse, но если есть способ уменьшить эти отходы, я бы предпочел использовать эти 200 МБ для буферов устройства блока ядра или кеша файла. Кроме того, у меня есть аналогичный опыт с другими программами Java - возможно, я мог бы уменьшить накладные расходы для всех с аналогичными изменениями.
Обновление: после публикации вопроса я нашел предыдущий пост SO:Почему Sun JVM продолжает потреблять еще большую память RSS, даже когда куча и т. Д. Устальны?Кажется, что я должен использовать pmap
исследовать проблему.
Решение
Я думаю, что причиной высокого потребления памяти вашей среды Eclipse является использование SWT. SWT - это нативная графическая библиотека, живущая за пределами кучи JVM, и для ухудшения ситуации реализация на Linux на самом деле не оптимизирована.
Я не думаю, что есть действительно шанс уменьшить потребление памяти вашей среды Eclipse, касающуюся памяти вне кучи.
Другие советы
Eclipse - это память и борьба CPU. В дополнение к библиотекам классов Java все материалы с низким уровнем графического интерфейса обрабатываются нативными системами системы, поэтому у вас будет существенная «нативная» библиотека JNI, чтобы выполнить вызовы с терминами низкого уровня X, прикрепленные к вашему процессу.
Eclipse предлагает миллионы полезных функций и множество помощников, чтобы ускорить ваши повседневные задачи по программированию - но стройно и означает, что это не так. Любое сокращение памяти или ресурсов, вероятно, приведет к заметному замедлению. Это действительно зависит от того, насколько вы цените свое время против памяти компьютеров.
Если вы хотите Lean и Mean Gvim и Make, непревзойденные. Если вы хотите завершить код, автоматические сборки и т. Д. Вы должны ожидать заплатить за это с помощью дополнительных ресурсов.
Если я запускаю следующую программу
public static void main(String... args) throws InterruptedException {
for (int i = 0; i < 60; i++) {
System.out.println("waiting " + i);
Thread.sleep(1000);
}
}
с ps auwx
отпечатки
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
500 13165 0.0 0.0 596680 13572 pts/2 Sl+ 13:54 0:00 java -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -cp . Main
Количество используемой памяти составляет 13,5 МБ. Есть около 200 МБ общих библиотек, которые учитываются в размере VSZ. Остальные могут быть зарегистрированы в Max Heap, Max Perm Gen с накладными расходами для стеков потоков и т. Д.
Проблема, кажется, не связана с JVM, а приложение, работающее в нем. Используя дополнительные общие библиотеки, прямое память и отображенные файлы памяти могут увеличить объем используемой памяти.
Учитывая, что вы можете купить 16 ГБ примерно за 100 долларов, знаете ли вы, что это на самом деле проблема?