2011-04-14 9 views
5

Tengo un pequeño Java application que escribí para registrar mis actividades laborales. Como lo tengo abierto todo el día, todos los días, una de las cosas que originalmente me preocupaba en cuanto a la elección del idioma es la cantidad de memoria que usaría.¿Por qué hay una gran diferencia en el uso de la memoria de una aplicación Java en Windows XP 32 vs Windows 7 64

Afortunadamente, en Windows XP yo normalmente consumiría unos 5 MB cuando se minimiza y 12 o así cuando se maximiza, y felizmente se ejecuta con -Xmx5M (consumo de memoria según el Administrador de tareas de Windows).

Cuando he actualizado mi PC en casa con un hardware más nuevo, y al mismo tiempo, a Windows 7 64, (aunque he instalado y estoy usando la JVM de 32 bits), que tomó nota de inmediato que la JVM para esta aplicación ahora informa 68 MB + siempre ... y eso es con -Xmx5M -Xss16K, de acuerdo con el "Conjunto de trabajo" del Administrador de tareas.

Tanto las máquinas antiguas como las nuevas tenían/​​tenían 4 GB de RAM, de los cuales 512 MB se usan por video. Ambos ejecutaban compilaciones recientes de Java 6, sobre la actualización 15 para WinXP y ahora la actualización 24 para Win7. La huella de la aplicación en el disco es de 70 K en 12 clases. Además, mi computadora de trabajo todavía es Windows XP, ejecutando Java 6_24, y muestra aproximadamente 12 MB para esta aplicación idéntica, y por idéntico quiero decir literalmente eso, ya que los dos sistemas están sincronizados para todas mis herramientas de desarrollo.

Como desarrollador, necesito entender las razones por las que mis aplicaciones parecen masticar tanta memoria.

¿Alguien puede arrojar algo de luz sobre esto, y sugerir cómo reducir significativamente la huella de memoria para una aplicación Java 6?

Editar

La respuesta puede ser en un tamaño excesivo PermGen. De acuerdo con JVisualVM, tengo un montón de:

Tamaño: 5,2 MB, Utilizado: 4,3 MB (pico) y Asignado de 6,2 MB.

pero para el PermGen

Tamaño: 12,5 MB, Usado: 4,6 MB (pico) y Asignado 67,1 MB.

enter image description here

lo tanto, es posible que los 68 MB que se muestran en el Administrador de tareas de Windows 7 es simplemente solicita a la memoria virtual, pero sin asignar?

EDIT 2

Reducir PermGen a 12 MB no tuvo ningún efecto sobre la memoria RAM proceso, pero jvisualvm lo demostró reducido (al parecer 12 MB que constituye una especie de mínimo, porque ir más bajo que el no tuvo ningún efecto en JVVM).

+0

¿Qué opciones usó para limitar el tamaño de la ondulación permanente generación? –

Respuesta

1

El sistema operativo de 64 bits utiliza 64 bits como el tamaño de los punteros, mientras que un sistema operativo de 32 bits utiliza 32 bits. Sin embargo, esa podría ser una de las razones.

1

Recuerde que todo en Java es un puntero (en su mayor parte), por lo que al cambiar a una máquina de 64 bits, con 64 bits de direcciones de memoria, los punteros se duplican.

Hay una opción en la JVM (-XX:+UseCompressedOops) para activar compressed object pointers. Esto colocará su uso de memoria cerca de los niveles que vio en máquinas de 32 bits.

+0

No creo eso, pero seguro que 12 MB podrían convertirse en 24 ... pero no en 64. –

1

Para la JVM de 64 bits puede especificar una opción que reduzca la sobrecarga del direccionamiento de 64 bits. Siempre que el montón sea inferior a 32 GB, esencialmente puede comprimir los punteros a 32 bits. En una aplicación Java típica, esto ahorra aproximadamente el 40% de la memoria. Ver Compressed oops in the Hotspot JVM para más detalles. Aquí está la opción para ello:

-XX:+UseCompressedOops 

Tenga en cuenta que si se utiliza una JVM de 32 bits en un sistema operativo de 64 bits que no tendrá que pagar los gastos generales de las direcciones de memoria de 64 bits (aunque hay una sobrecarga diferente a pagar allí en la traducción, pero es muy poco importante).

Creo que Windows 7 no informa la memoria usa lo mismo que XP tampoco (sin embargo, no tengo una referencia). Entonces, para una comparación justa de 32 bits frente a 64 bits, debe ejecutar ambos en la misma versión de Windows.

+0

I * am * usando el JDK y JRE de 32 bits - y probando la opción de arriba informa 'Opción de máquina virtual no reconocida '+ UseCompressedOops' '. –

+1

Ah, vale. La diferencia es puramente el sistema operativo entonces. Y la mayoría (si no toda) de la diferencia está solo en la memoria que informa entre XP y 7 como se mencionó. La opción '-XX: + UseCompressedOops' solo es aplicable a una JVM de 64 bits, ya que la JVM de 32 bits ya usará el direccionamiento de 32 bits. – WhiteFang34

0

Esto no tiene nada que ver con que el sistema operativo sea de 64 bits: Windows XP y Windows 7 usan RAM en verydifferent ways.

Debido a esto, Windows 7 casi siempre informa que todos los programas utilizan más memoria que Windows XP. No se preocupe por esto, esto es solo el resultado de que Windows 7 use su memoria como debería: como caché.

+0

Sin embargo, no estoy hablando de la RAM utilizada por el sistema, por lo que no pregunté esto en la SU. Me pregunto por qué Java ejecutando mi aplicación, que requiere muy poco en WinXP, usa mucha más memoria RAM en Win7. Como puedo tener que explicar esto a mis clientes. –

+0

@Software: * estás * hablando de cómo el sistema usa tu RAM. La respuesta a su pregunta es: su software no está usando más RAM, el sistema simplemente informa que sí lo está. Parte de esto puede ser que Windows asigne a Java más memoria de la solicitada, para que las asignaciones futuras sean más rápidas; algo de esto puede ser la [precarga] mejorada (http://en.wikipedia.org/wiki/Prefetcher) en Windows 7, tanto de dlls como de archivos accedidos previamente. ** Esto es algo bueno **: el uso de la memoria de este tipo acelera tanto el sistema operativo como su software. (cont.) –

+0

(cont.) A diferencia de Windows XP, en Windows 7 ** solo porque el administrador de tareas dice que estás al 90% de uso de la memoria no significa que te estés quedando sin memoria ** - solo significa que el sistema operativo está haciendo su trabajo, cargando todo cree que alguna vez necesitarás RAM. La RAM es muchísimo más rápida que la HDD, por lo que la memoria no utilizada es una pérdida de memoria. Cuando en realidad ** necesita ** más memoria, Windows eliminará de la memoria las páginas que no necesitaba y, si es necesario, las cambiará al disco. Si su cliente pregunta, haga que lean ese artículo Coding Horror (y compare el uso de memoria de * cualquier otra aplicación *) –

0

Si bien no es toda la historia, el tamaño PermGen es 30% más grande en plaforms de 64 bits:

-XX: MaxPermSize - Tamaño de la Generación Permanente. [5.0 y versiones posteriores: las máquinas virtuales de 64 bits tienen una escala de un 30% más grande; 1,4 amd64: 96 m; 1.3.1 -client:. 32m]

Cuestiones relacionadas