Estoy corriendo top
para monitorear el rendimiento de mi servidor y 2 de mis procesos java muestran una memoria virtual de hasta 800MB-1GB. ¿Es eso algo malo?
¿Qué significa la memoria virtual?
Y, por cierto, tengo un intercambio de 1 GB y muestra un 0% de uso. Entonces estoy confundido.
Proceso Java = 1 servidor Tomcat + mi propio servidor java daemon = Ubuntu 9.10 (kármico)
linux
virtualization
memory
top
kapso
fuente
fuente
Respuestas:
La memoria virtual ni siquiera es necesariamente memoria. Por ejemplo, si una memoria de proceso asigna un archivo grande, el archivo se almacena realmente en el disco, pero aún ocupa "espacio de direcciones" en el proceso.
El espacio de direcciones (es decir, memoria virtual en la lista de procesos) no cuesta nada; No es real. Lo que es real es la columna RSS (RES), que es la memoria residente. Esa es la cantidad de memoria real que ocupa un proceso.
Pero incluso esa no es la respuesta completa. Si un proceso llama a fork (), se divide en dos partes, y ambas inicialmente comparten todos sus RSS. Entonces, incluso si RSS era inicialmente de 1 GB, el resultado después de la bifurcación sería dos procesos, cada uno con un RSS de 1 GB, pero aún estaría usando 1 GB de memoria.
Confundido todavía? Esto es lo que realmente necesita saber: use el
free
comando y verifique los resultados antes y después de iniciar su programa (en+/- buffers/cache
línea). Esa diferencia es la cantidad de nueva memoria utiliza su programa iniciado recientemente.fuente
smem
.java -Xmx16g RunLong
, que reservaría 16Gb de memoria para el proceso de Java, entonces, en laVIRT
parte superior, parece que se cuentan los 16Gb. En este caso, ¿cuál es el tipo de esta memoria de 16 Gb, es esa memoria asignada o ...?Desde la página de manual superior (1):
Donde RES significa memoria RESIDENTE (memoria física utilizada).
En realidad eso no es correcto (más). Cuando dice "swap", eso también incluye archivos que el programa ha asignado a su espacio de direcciones, que pueden o no estar consumiendo RAM real todavía. Esta memoria está respaldada por archivos pero no es realmente intercambiable.
VIRT también incluye páginas que se han asignado pero que aún no se han utilizado para nada. Cualquier página en este estado está asignada a la página cero del núcleo (concepto brillante, debe buscarla) para que aparezca en VIRT pero en realidad no consume memoria.
fuente
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
. Es una pena que no pueda rechazar esta respuesta.Esta explicación de Mugurel Sumanariu me pareció muy clara:
fuente
La columna VIRT en la salida ps / top es casi irrelevante para medir el uso de memoria. No te preocupes por eso. Apache VIRT de carga pesada vs memoria RES
https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
fuente
Linux admite memoria virtual, es decir, usar un disco como una extensión de RAM para que el tamaño efectivo de la memoria utilizable crezca de manera correspondiente. El kernel escribirá el contenido de un bloque de memoria no utilizado actualmente en el disco duro para que la memoria pueda usarse para otro propósito. Cuando los contenidos originales se necesitan nuevamente, se vuelven a leer en la memoria. Todo esto se hace completamente transparente para el usuario; los programas que se ejecutan en Linux solo ven la mayor cantidad de memoria disponible y no notan que partes de ellos residen en el disco de vez en cuando. Por supuesto, leer y escribir el disco duro es más lento (del orden de mil veces más lento) que usar memoria real, por lo que los programas no se ejecutan tan rápido. La parte del disco duro que se utiliza como memoria virtual se denomina espacio de intercambio.
Linux puede usar un archivo normal en el sistema de archivos o una partición separada para el espacio de intercambio. Una partición de intercambio es más rápida, pero es más fácil cambiar el tamaño de un archivo de intercambio (no es necesario volver a particionar todo el disco duro y posiblemente instalar todo desde cero). Cuando sepa cuánto espacio de intercambio necesita, debe optar por una partición de intercambio, pero si no está seguro, puede usar primero un archivo de intercambio, use el sistema por un tiempo para que pueda tener una idea de cuánto intercambio necesita, y luego haga una partición de intercambio cuando esté seguro de su tamaño.
También debe saber que Linux le permite a uno usar varias particiones de intercambio y / o archivos de intercambio al mismo tiempo. Esto significa que si solo ocasionalmente necesita una cantidad inusual de espacio de intercambio, puede configurar un archivo de intercambio adicional en esos momentos, en lugar de mantener la cantidad total asignada todo el tiempo.
Una nota sobre la terminología del sistema operativo: la informática generalmente distingue entre el intercambio (escribir todo el proceso en el espacio de intercambio) y la paginación (escribir solo partes de tamaño fijo, generalmente unos pocos kilobytes, a la vez). La paginación suele ser más eficiente, y eso es lo que hace Linux, pero la terminología tradicional de Linux habla sobre el intercambio de todos modos.
Fuente: http://www.faqs.org/docs/linux_admin/x1752.html
fuente
VIRtual
columna de la parte superior, se refiere al súper espacio (espacio de súper consumo) del proceso, que el proceso podría no estar realmente tomando en el tiempo de ejecución. Hay otra columnaRESident
, que se refiere a la memoria física / espacio real asignado por el proceso, en el tiempo de ejecución.El motivo de la diferencia, entre los dos, puede entenderse con el ejemplo: si el proceso está utilizando cierta biblioteca, entonces el tamaño de la biblioteca también ayudará a la
virtual-size
. sin embargo, dado que solo se usaría una parte de la biblioteca (es decir, algunos métodos en uso), por lo que ayudaráresident-size
.Consulte para más información
fuente
"VIRT" solo direcciona el espacio, RES es la memoria "real", pero la cantidad "SHR" (= compartida) de "RES" es la parte de RES que se comparte con otros procesos. Entonces, para la mayoría de los procesos, creo que restando SHR de RES le da la cantidad de memoria que realmente es atribuible a este proceso en particular.
fuente