- ¿Cuáles son las diferencias entre los espacios de memoria Java (Perm Space, Space Stack, Heap Space)?
- ¿Cuándo utiliza la JVM una u otra?
- Si uso Scala/Groovy/etc., ¿Hay diferencias?
Respuesta
Simplemente
- espacio de almacenamiento dinámico: Todos los objetos se asignan en vivo aquí.
- Espacio de pila: Almacena las referencias al objeto para la variable en llamada de método o instanciación de variable.
- espacio Perm: Tiendas cargado clases de información
Por ejemplo:
Student std = new Student();
después de ejecutar la línea anterior estado de la memoria serán así.
- Montón: tiendas "nuevo estudiante()"
- Stack: almacena información sobre "std"
- Perm Espacio: almacena información acerca de la clase Estudiante
Stack también almacena literales primitivos. –
@Daniel: Gracias por la información. No lo sabía, y estudiaré más sobre eso. – Kowser
@Daniel: Stack también almacena literales primitivos. ¿Que quieres decir con eso? Hablando estrictamente que la pila no almacena _cualquier cosa_ en la pila solo hay parámetros para llamadas a métodos y "valores" que se usan para evaluar expresiones. –
Perdóname por la adición de una respuesta a una pregunta tan antigua: la respuesta actual es excelente, pero se pierde un par de casos extremos debido al código estático y las actualizaciones de Java 8.
general
- Pila
- asignados por hilo
- Tiendas referencias locales y primitivas
- Esto está en el ámbito de memoria - Cuando un método o extremos de hilo, todos sus datos en el la pila se ha perdido
- Tiene el acceso más rápido, por lo que una primitiva local es más rápida para usted se que un objeto local
- Montón
- existen todas las instancias de objetos asignados aquí
- Dividido en generaciones, con la generación más joven es el primer lugar de GC se ve
- Disponible para todos los hilos para las asignaciones y las desasignaciones se deben sincronizar
- Esta memoria se puede fragmentar (pero generalmente no se administra esto usted mismo)
- PermGen Código
- Stores información de clase cargado
- Almacena información inmutable (Primatives, internados cuerdas)
- Tiendas clase estática members
Ejemplo
public class SimpleVal { //The Class (loaded by a classloader) is in the PermGen
private static final int MAGIC_CONSTANT = 42; //Static fields are stored in PermGen
private static final SimpleVal INSTANCE = new SimpleVal(1); //Static field objects are created in the heap normally, with the reference in the PermGen ('class statics' moved to the heap from Java 7+)
private static SimpleVal previousInstance; //Mutable static fields also have their reference in PermGen so they can easily cause memory leaks
private int value; //Member variables will be part of the heap
public SimpleVal(int realValue) {
value = realValue;
...
}
public static int subtract(SimpleVal val1, SimpleVal val2) {
....
}
public int add(SimpleVal other) { //Only one copy of any method (static or not) exists - in PermGen
int sum = value + other.value; //Local values in methods are placed in the Stack memory
return sum;
}
}
public static void main(String[] args) {
SimpleVal val1 = null;
SimpleVal val2 = new SimpleVal(3); //Both of these variables (references) are stored in the Stack
val1 = new SimpleVal(14); //The actual objects we create and add to the variables are placed in the Heap (app global memory, initially in the Young Gen space and later moved to old generation, unless they are very large they can immediately go old gen)
int prim = val1.add(val2); //primitive value is stored directly in the Stack memory
Integer boxed = new Integer(prim); //but the boxed object will be in the heap (with a reference (variable) in the Stack)
String message = "The output is: "; //In Java 7+ the string is created in the heap, in 6 and below it is created in the PermGen
System.out.println(message + prim);
}
Java 8 Nota: espacio PermGen fue reemplazado con lo que se llama metaespacio. Esto sigue funcionando igual pero puede redimensionarse automáticamente: de forma predeterminada, Metaspace auto aumenta su tamaño en la memoria nativa hasta un máximo (especificado en los parámetros JVM), pero PermGen siempre tiene un tamaño máximo fijo contiguo a la memoria Heap.
Android Note: De Android 4.0 (de 3.0 en la práctica) Android debería cumplir con los contratos de memoria descritos, pero en versiones anteriores el implementation was broken. La memoria 'Stack' en Android-Davlik está de hecho basada en el registro (los tamaños de las instrucciones y los recuentos varían entre los dos, pero para un desarrollador la funcionalidad sigue siendo la misma).
Por último, para obtener más información sobre la mejor respuesta que he visto a este tema en StackOverflow es here
- 1. Perm espacio vs Heap space
- 2. Applet: Java heap space
- 3. C++ deque vs queue vs stack
- 4. JVM - Heap and Stack
- 5. Threading Heap and Stack
- 6. Java.lang.OutOfMemory Java Heap Space JDeveloper
- 7. Pentaho vs Microsoft BI Stack
- 8. SQL Server 2008 Empty String vs. Space
- 9. Java Heap space Xmx Xms parámetros ignorados
- 10. Error de Java Heap Space en glassfish
- 11. Java Heap Space - ¿Cómo funciona -Xmx exactamente?
- 12. Memoria de proceso Vs Heap - JVM
- 13. C# structs/classes stack/heap control?
- 14. Dirección de Stack y Heap en C++
- 15. Excepción en el hilo "principal" java.lang.OutOfMemoryError: Java heap space
- 16. Excepción en el hilo "principal" java.lang.OutOfMemoryError: Java heap space
- 17. std :: string vs. char *
- 18. Generación joven, permanente y Perm
- 19. ¿Qué va a RAM, Harddrive, Stack y Heap en C++?
- 20. ¿Gestión de memoria global en C++ en stack o heap?
- 21. ¿Qué, además de objetos de Clase, se almacena en Perm Gen Space (sol 1.6 VM)?
- 22. Boxeo vs Unboxing
- 23. J2ME VS Android VS iPhone VS Symbian VS Windows CE
- 24. TagSoup vs Jsoup vs HTML Analizador vs vs HotSax
- 25. 'método' vs. 'mensaje' vs. 'función' vs. '???'
- 26. ACE vs Boost vs Poco vs wxWidgets
- 27. VS 2008 vs VS 2008 Express
- 28. Atomikos vs JOTM vs Bitronix vs?
- 29. Acumular vs fold vs reducir vs compress
- 30. .NET vs ASP.NET vs CLR vs ASP
relacionadas: http://stackoverflow.com/questions/4848669/perm-space-vs-heap-space , http://stackoverflow.com/questions/1279449/what-is-perm-space – Mat
[La pila es un detalle de implementación] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/ 27/the-stack-is-a-implementation-detail.aspx). Puede que no sea tan importante para Java, ya que carece de tipos de valores definidos por el usuario, pero sigue siendo una lectura importante para todos los que trabajan en un lenguaje recogido de basura. – delnan
otros lenguajes JVM usan el mismo estándar? – caarlos0