Pregunta

Este problema es específicamente sobre Sun Java JVM ejecutando en Linux x86-64. Estoy tratando de averiguar Por qué el Sun JVM toma gran parte de la memoria física del sistema, incluso cuando he establecido límites de montón y no lavado..

El programa que estoy ejecutando es Eclipse 3.7 con múltiples complementos/características. Las características más utilizadas son PDT, Egit y Mylyn. Estoy comenzando el eclipse con los siguientes interruptores de línea de comando:

-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

Vale la pena señalar que son especialmente los interruptores:

-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m

Estos interruptores Debe limitar el montón JVM al máximo de 200 MB y no tener alojamiento a 150 MB ("CMS Generación permanente" y "Cache de código" etiquetado por JConsole). Lógicamente, el JVM debe tomar un total de 350 MB más la sobrecarga interna requerida por el JVM.

En realidad, el JVM toma 544.6 MB para mi proceso de eclipse actual calculado por ps_mem.py (http://www.pixelbeat.org/scripts/ps_mem.py) que calcula las páginas de memoria física reales reservadas por el núcleo Linux 2.6+. ¡Esa es la sobrecarga interna de Sun JVM del 35% o aproximadamente 200 MB!

¿Alguna pista sobre cómo disminuir esta sobrecarga?

Aquí hay información adicional:

$ 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 ...

Y según JConsole, el proceso ha utilizado 160 MB de montón y 151 MB de no heAP.

No estoy diciendo que no puedo permitirme usar 200 MB adicionales para ejecutar Eclipse, pero si hay una manera de reducir este desperdicio, prefiero usar ese 200MB para buffers de dispositivos de bloque de kernel o caché de archivos. Además, tengo una experiencia similar con otros programas de Java, tal vez podría reducir la sobrecarga para todos ellos con ajustes similares.

ACTUALIZACIÓN: Después de publicar la pregunta, encontré una publicación anterior en So:¿Por qué el Sun JVM continúa consumiendo cada vez más memoria RSS incluso cuando los tamaños de montón, etc. son estables?Parece que debería usar pmap para investigar el problema.

¿Fue útil?

Solución

Creo que la razón del alto consumo de memoria de su entorno de eclipse es el uso de SWT. SWT es una biblioteca gráfica nativa que vive fuera del montón de la JVM, y para empeorar la situación, la implementación en Linux no está realmente optimizada.

No creo que haya una oportunidad para reducir el consumo de memoria de su entorno de eclipse con respecto a la memoria fuera del montón.

Otros consejos

Eclipse es una memoria y CPU Hog. Además de las bibliotecas de clase Java, todas las cosas de GUI de gama baja se manejan por llamadas del sistema nativo, por lo que tendrá una sustancial biblioteca JNI "nativa" para ejecutar las llamadas de bajo nivel X de términos adjuntos a su proceso.

Eclipse ofrece millones de características útiles y muchos ayudantes para acelerar sus tareas de programación diarias, pero delgada y significa que no lo es. Cualquier reducción en la memoria o recursos probablemente dará como resultado una desaceleración notable. Realmente depende de cuánto valore su tiempo frente a la memoria de su computadora.

Si quieres que GVIM y MÁS, son inmejorables. Si desea la finalización del código, las compilaciones automáticas, etc. debe esperar pagar esto con recursos adicionales.

Si ejecuto el siguiente programa

public static void main(String... args) throws InterruptedException {
    for (int i = 0; i < 60; i++) {
        System.out.println("waiting " + i);
        Thread.sleep(1000);
    }
}

con ps auwx huellas dactilares

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

La cantidad de memoria utilizada es de 13.5 MB. Hay alrededor de 200 MB de bibliotecas compartidas que cuentan para el tamaño VSZ. El resto se puede contontar en el montón máximo, max permang gen con una sobrecarga para las pilas de hilo, etc.

El problema no parece estar con el JVM sino la aplicación que se ejecuta en él. El uso de bibliotecas compartidas adicionales, la memoria directa y los archivos asignados por memoria pueden aumentar la cantidad de memoria utilizada.

Dado que puede comprar 16 GB por alrededor de $ 100, ¿sabe que esto es realmente un problema?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top