Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Administracindememoriaenjava 130714214058 Phpapp01
Administracindememoriaenjava 130714214058 Phpapp01
http://javacuriosities.blogspot.com.ar/
Temario
Qu es la memoria?
Quin esta a cargo del manejo de la memoria en Java?
Que es la memoria?
La memoria es la parte utilizada por los sistemas informticos para
almacenar informacin en tiempo de ejecucin, o sea estamos hablando de
memoria voltil, por lo cual su contenido se pierde cuando se apaga el
equipo.
Estructura de la JVM
Stack
Stack Frame
- Frame: Cada mtodo invocado crea un nuevo frame, este es usado para
almacenar datos y resultados parciales, solo un frame esta activo a la vez. El
frame es destruido cuando finaliza la invocacin del mtodo esta puede ser de
manera normal o abrupta.
- Local Variables: Cada frame contiene un array con sus propias variables
locales.
- Operand Stack: Cada frame contiene una pila, cuando un nuevo frame es
creado este se encuentra vaco, en esta estructura se van alocando las
instrucciones a ejecutar.
Heap Area
El Heap es el espacio de memoria en donde se almacenan las instancias
de clases (Objetos) y arreglos. Esta puede crecer o ser reducida
automticamente bajo demanda. El Garbage Collector (GC) es el
encargado de reclamar el espacio que los objetos van liberando. Esta rea
es compartida por todos los threads.
Podemos identificar las siguientes dos partes
Young Generation
- Eden Space: Esta es el rea inicial donde se inicializan la mayora de los
objetos.
- Survivor Space: En esta rea se almacenan los objetos que han sobrevivido a
la recoleccin de basura en el Eden. En general esta rea esta dividida en dos
partes From y To.
Old Generation
- Tenured Space: Contiene los objetos que han existido por un tiempo largo y
que han pasado por el Survivor space.
Administracin de memoria en Java
Non-Heap Area
Esta rea incluye los objetos que son considerados parte de la JVM. Al
igual que el heap esta puede crecer o ser reducida automticamente bajo
demanda. Dependiendo de la implementacin de la JVM el GC puede
actuar sobre esta rea o compactarla. Esta rea es compartida por todos
los threads.
Podemos identificar las siguientes dos partes
Permanent Generation
- Este espacio contiene todos los datos reflectivos de la JVM como por ejemplo
clases y mtodos. Adems contiene la estructura por clase (Propiedades, Firma
de mtodos e implementacin de mtodos). Esta rea adems contiene dos
espacios llamados Shared-RO and Shared-RW
Code Cache
- Contiene la memoria usada para el cdigo compilado por el JIT compiler y
almacenado de cdigo nativo
Ejemplo
HelloWorld.java
RuntimeConstantPool.java
Classloaders
Bootstrap Classloader carga el API bsica de Java e inicia el System
Class Loader.
El System Classloader enva los archivos .class por medio de un stream
binario a la JVM.
Ejemplo
ClassLoaderDelegation.java
Inicializadores estticos
- Inmediatamente despus de cargar la clase se ejecutan los inicializadores estticos
de la clase.
Declaracin
Instanciacin
Inicializacin
Ejemplo
LifeCycle.java
Size (Bytes)
Wrapper Type
Size (Bytes)
char
2 Character
16
byte
1 Byte
16
short
2 Short
16
int
4 Integer
16
long
8 Long
16
float
4 Float
16
double
8 Double
16
boolean
1 Boolean
16
Ejemplos
SizeOfPrimitives.java
SizeOfWrappers.java
Size of Objetos
Como vimos antes los wrappers pueden consumir mucha memoria,
pero lo importante es entender el porque de esto.
Reglas:
Objetos:
- El tamao base de cualquier objeto es 8 bytes.
- El tamao total de un objeto siempre es mltiplo de 8 (Esto se lo conoce como
padding)
Atributos:
- Si el tipo del atributo es primitivo ocupa el size que le corresponde.
- Si el tipo del atributo es un objeto, entonces ocupa 4 bytes porque es una
referencia.
Arrays:
- Array de primitivos ocupa: 8 (Base) + 4 (Length) + Length * size del tipo primitivo.
- Array de objetos ocupa: 8 (Base) + 4 (Length) + Length * 4 (Size de una
referencia).
Administracin de memoria en Java
Figura 1:
Figura 2:
Ejemplos
SizeOfObjects.java
ShallowVsRetained.java
Parmetros de memoria
Parmetros JVM
Parmetro
Definicion
Ejemplo
-Xms
-Xms512M
-Xmx
-Xmx512M
-XX:NewSize
-XX:NewSize=128M
-XX:MaxNewSize / -Xmn
-XX:MaxNewSize=128M
-XX:NewRatio
-XX:NewRatio=3
-XX:SurvivorRatio
-XX:SurvivorRatio=6
-XX:PermSize
-XX:PermSize=64M
-XX:MaxPermSize
-XX:MaxPermSize=128M
-Xss
-XX:ThreadStackSize
-XX:ThreadStackSize=256k
-XX:MinHeapFreeRatio
-XX:MinHeapFreeRatio=40
-XX:MaxHeapFreeRatio
-XX:MaxHeapFreeRatio=70
-XX:TargetSurvivorRatio
Indica hasta que porcentaje se puede llenar el Survivor antes de mover al Old
-XX:TargetSurvivorRatio=90
Ejemplos
JVMParameters.java
MemoryViewer.java
Garbage Collector
La Recoleccin de basura automtica es el proceso de buscar en la
memoria y liberar aquellos objetos que estn disponibles para ser
recolectados, podemos identificar dos tipos de objetos
Reachable (Objeto sobre el cual aun hay referencias) : Significa que alguna
parte de nuestro programa todava mantiene una o mas referencias a ese
objeto.
Lnea #6
Lnea #8
Lnea #11
System.runFinalization(): Le sugiere a la
JVM a ejecutar el mtodo finalize de los
objetos que estn en la cola de finalizacin.
Tipos de recolecciones
Existen dos tipos de recolecciones
Minor GC
- Ejecutado en el Young Generation, cuando el Eden se encuentra lleno o antes
de incrementar el espacio de esta rea se ejecuta esta recoleccin. Aqu se usa
un algoritmo de copia.
Full GC
- Ejecutado en el Tenured Generation, cuando el Old se encuentra lleno se
ejecuta esta recoleccin o antes de incrementar el espacio de esta rea. Aqu
se puede usar el algoritmos MSC(Mark- Sweep- Compact) o CMS (Concurrent
Mark Sweep), este ultimo no compacta los objetos luego de su ejecucin lo cual
genera que pedir memoria sea un poco mas complejo. Incluye el PermGen en
su recoleccin.
Algoritmo de CMS
N
1
Fase
Initial Mark
(Stop the World Event)
2 Concurrent Marking
Remark
(Stop the World Event)
Descripcion
Es una pausa pequea donde todos los objetos "reachable" son marcados.
4 Concurrent Sweep
Remueve los objetos que son "unreachable", es importante notar que los objetos
"reachable" no son movidos, o sea no hay compactacion.
5 Resetting
Young Generation:
"Serial" corre en un solo hilo y es del tipo STW (Stop-the-world).
"Parallel Scavenge" corre en mltiples hilos y aunque es del tipo STW
(Stop-the-world), obtiene una mejor performance.
GC Collectors
JVM
Young Collector
Tenured Collector
Serial
-XX:+UseParNewGC
ParNew
-XX:+UseParallelGC
Parallel Scavenge
-XX:+UseParallelOldGC
Parallel Scavenge
Parallel Old
-XX:-UseParNewGC
-XX:+UseConcMarkSweepGC
Serial
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
ParNew
-XX:+UseSerialGC
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
G1
JVM Ergonomics
Desde el JDK 5.0 la JDK detecta en que tipo de maquina esta y cambia su
configuracin, modo cliente o modo servidor.
Estos cambios incluyen:
- Configuracin de memoria mnima y mxima para el Heap.
- Seleccin automtica del GC.
- Activa el resize automtico para el rea Young y Tenured.
- Otras configuraciones adicionales.
Analizando el GC (Parmetros)
Parmetro
Definicion
-verbose:gc
-Xloggc:GCLogs.log
Guarda la misma informacin que -verbose:gc en un archivo que le indiquemos pero adems
agrega mas detalle
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
Ejemplos
GCMXBean.java
GCDetails.java
Tipos de OOM
java.lang.OutOfMemoryError: unable to create new native thread
- OOM en la memoria nativa, esta rea no es controlada por nosotros sino que la maneja el SO (Sistema
Operativo).
Java 32-bit Native Heap = Max Process Size Java Heap PermGen
Java 64-bit Native Heap = Memoria Fisica & Virtual Java Heap PermGen
Ejemplos
OOMNativeHeap.java
OOMJavaHeapSpace.java
OOMPermGenSpace.java
OOMRequestArraySize.java
Heap Dump
Un Heap dump es una foto de la memoria de un proceso Java
en un determinado momento.
Dependiendo de la JVM el Heap dump puede contener una
informacin o otra, adems en general antes de ejecutar el
volcado un recoleccin completa es ejecutada (Full GC).
HeapDumpOnOutOfMemoryError
Cuando la aplicacin arroje un OOM se generara un heap dump, usando el HeapDumpPath
configurado.
Jmap
Tool que viene incorporada en el jdk.
jmap -dump:file=<file-location> <pid>
HotSpotDiagnosticMXBean(Usando Reflection)
Usando el DiagnosticMXBean para hacer el dump
Definicion
Ejemplo
-XX:HeapDumpPath
-XX:HeapDumpPath=C:\temp
Ejemplo
MainHeapDump.java
HeapDumpPath.java
Histogram
- Nos muestra la cantidad de objetos por cada clase.
- Referencias JNI
JDK Tools
Jps
- Nos brinda informacin de los procesos Java corriendo en nuestra computadora y no
entrega el PID.
Jmap
- Nos ofrece informacin de las reas de memoria del proceso Java indicado y adems nos
permite generar Heap Dumps y Histogramas.
Jhat
- Herramienta de anlisis del Heap, es experimental y puede no estar incluida en futuras
versiones.
Jstat
- Nos brinda informacin estadstica sobre el proceso Java que le indicamos, esta
estadsticas incluyen tiempo del GC, JIT Compiler, Classloaders.
Jstack
- Ejecuta un Thread Dump o sea un volcado de cada Thread.
Jinfo
- Brinda informacin de configuracin de un proceso Java.
Administracin de memoria en Java
Links
VisualVM
http://visualvm.java.net/
Memory Analyzer (MAT)
http://www.eclipse.org/mat/downloads.php
GCViewer
https://github.com/chewiebug/GCViewer/wiki/Changelog
Jprofiler
http://www.ej-technologies.com/products/jprofiler/overview.html