Как уменьшить внутренние накладные расходы на солнце/Oracle JVM?

StackOverflow https://stackoverflow.com/questions/7805743

Вопрос

Эта проблема специально о 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 долларов, знаете ли вы, что это на самом деле проблема?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top