2012-02-05 36 views
9

Sé que hay las mismas preguntas como this one que me han preguntado y respondido. No estoy satisfecho con las respuestas, así que permítanme poner en más detalles los mensajes aquí.Limitar la memoria de proceso de jvm en ubuntu

Intento iniciar mi aplicación con OPT de JVM: -Xmx128m -Xms32m -XX:MaxPermSize=64m. Cuando se inició la aplicación y comprobé el uso de la memoria escribiendo cat /proc/10413/status, ¡y encontré que el vmsize es más de 600512 kB! que es mucho más grande que mi configuración. Me gustaría saber cómo limitar el uso de la memoria jvm del proceso.

Name: java 
State: S (sleeping) 
Tgid: 10413 
Pid: 10413 
PPid: 1 
TracerPid:  0 
Uid: 1001 1001 1001 1001 
Gid: 1007 1007 1007 1007 
FDSize: 128 
Groups: 1001 1007 
**VmPeak: 728472 kB** 
**VmSize: 600512 kB** 
VmLck:   0 kB 
VmHWM: 298300 kB 
VmRSS: 280912 kB 
VmData: 647804 kB 
VmStk:  140 kB 
VmExe:  36 kB 
VmLib:  13404 kB 
VmPTE:  808 kB 
VmSwap:  0 kB 
Threads:  33 
SigQ: 0/31522 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 2000000181005ccf 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: ffffffffffffffff 
Cpus_allowed: f 
Cpus_allowed_list:  0-3 
Mems_allowed: 00000000,00000001 
Mems_allowed_list:  0 
voluntary_ctxt_switches:  3 
nonvoluntary_ctxt_switches:  2 

Respuesta

9

Usted no puede controlar lo que desea controlar, -Xmx sólo controla el montón de Java, que no controla el consumo de memoria nativa por la JVM, que se consume completamente diferente en función de la aplicación .

Desde el siguiente artículo Thanks for the Memory (Understanding How the JVM uses Native Memory on Windows and Linux)

Mantener el colector montón de basura y utilizar la memoria nativa que no puede controlar.

Se necesita más memoria nativa para mantener el estado del sistema de gestión de memoria que mantiene el almacenamiento dinámico de Java. Las estructuras de datos se deben asignar para rastrear el almacenamiento libre y registrar el progreso cuando recogen basura. El tamaño exacto y la naturaleza de estas estructuras de datos varían con la implementación, pero muchas son proporcionales al tamaño de del montón.

y el compilador JIT utiliza la memoria nativa al igual que javac haría

compilación bytecode utiliza memoria nativa (de la misma manera que un compilador estática, como gcc requiere memoria para funcionar), pero tanto el entrada (el bytecode) y la salida (el código ejecutable) del JIT también debe estar almacenado en la memoria nativa. Las aplicaciones Java que contienen muchos métodos compilados JIT utilizan más memoria nativa que las aplicaciones más pequeñas.

y entonces usted tiene el cargador de clase (s) que utilizan memoria nativa

aplicaciones Java están compuestas de clases que definen la estructura y la lógica objeto método. También usan clases de las bibliotecas de la clase de tiempo de ejecución Java (como java.lang.String) y pueden usar bibliotecas de terceros . Estas clases deben almacenarse en la memoria durante el tiempo que estén en uso. Cómo se almacenan las clases varía según la implementación.

Ni siquiera voy a empezar citando la sección de Temas, creo que la idea de que -Xmx no controla lo que creo que controla, controla el almacenamiento dinámico de JVM, no todo va en la JVM montón, y el montón ocupa mucho más memoria nativa que lo que especifique para gestión y contabilidad.

1

Al igual que cualquier otro proceso en Linux, se puede limitar el uso de memoria del proceso de JVM (diga a 4 GB):

$ ulimit -v 4194304 
$ java ... # execute your Java program 

(Técnicamente esto es en realidad la memoria virtual, que es una cota superior para real uso de memoria. But ulimit apparently doesn't work with actual RAM usage.)

Esto hará que las asignaciones de memoria por encima del límite fallen, lo que probablemente resulte en un OutOfMemoryError y la aplicación salga.

Cuestiones relacionadas