java - tirar - reciclaje de pilas
¿Cuál es el tamaño de pila predeterminado, puede crecer, cómo funciona con la recolección de basura? (2)
Entiendo que cada hilo tiene su propia stack
. Los tipos primitivos y las referencias se mantienen en la pila, y no se mantiene ningún objeto en la pila. Mis preguntas son:
- ¿Cuánto puede crecer una pila? (como con los parámetros -
Xms
y -Xmx
) - ¿Podemos limitar su crecimiento?
- ¿La pila tiene un valor mínimo predeterminado y un valor máximo?
- ¿Cómo funciona la recolección de basura en la pila?
Como dices, las variables locales y las referencias se almacenan en la pila. Cuando regresa un método, el puntero de la pila simplemente vuelve al estado anterior al inicio del método, es decir, todos los datos locales se "eliminan de la pila". Por lo tanto, no se necesita recolección de basura en la pila, eso solo ocurre en el montón.
Para responder a sus preguntas específicas:
- Vea esta pregunta sobre cómo aumentar el tamaño de la pila.
- Puedes limitar el crecimiento de la pila de la siguiente manera:
- agrupando muchas variables locales en un objeto: ese objeto se almacenará en el montón y solo la referencia se almacenará en la pila
- limite el número de llamadas a función anidadas (generalmente al no usar recursividad)
- Para Windows, el tamaño de pila predeterminado es 320k para 32bit y 1024k para 64bit, consulte este enlace .
¿Cuánto puede crecer una pila?
Puede usar una opción de VM llamada ss
para ajustar el tamaño máximo de la pila. Una opción de VM generalmente se pasa usando -X {opción}. Entonces puede usar java -Xss1M
para establecer el máximo de tamaño de pila en 1M.
Cada hilo tiene al menos una pila. Algunas máquinas virtuales Java (JVM) colocan la pila Java (llamadas al método Java) y la pila nativa (llamadas al método nativo en la máquina virtual) en una pila y realizan el desenrollado de la pila utilizando un marco administrado a nativo, conocido como M2NFrame. Algunas JVM mantienen dos pilas por separado. El Xss
establece el tamaño de la pila de Java en la mayoría de los casos.
Para muchas JVM, ponen diferentes valores predeterminados para el tamaño de la pila en diferentes plataformas.
¿Podemos limitar este crecimiento?
Cuando ocurre una llamada a un método, se creará un nuevo marco de pila en la pila de ese hilo. La pila contendrá variables locales, parámetros, dirección de retorno, etc. En java, nunca puedes poner un objeto en la pila, solo la referencia del objeto se puede almacenar en la pila. Como array también es un objeto en Java, las matrices tampoco se almacenan en la pila. Por lo tanto, si reduce la cantidad de sus variables primitivas locales, los parámetros al agruparlos en objetos, puede reducir el espacio en la pila. En realidad, el hecho de que no podamos poner objetos en la pila java afecta el rendimiento en algún momento (error de caché).
¿La pila tiene algún valor mínimo predeterminado o valor máximo predeterminado?
Como dije antes, las diferentes máquinas virtuales son diferentes y pueden cambiar de versiones. Mira here .
¿Cómo funciona la recolección de basura en la pila?
Las recolecciones de basura en Java son un tema candente. La recolección de basura tiene como objetivo recolectar el objeto inalcanzable en el montón. Entonces eso necesita la definición de alcanzable. Todo en la pila consiste en parte de las referencias del conjunto raíz en GC. Todo lo que se puede acceder desde cada pila de cada hilo se debe considerar en vivo. También hay algunas otras referencias de conjunto raíz como objetos Thread y algunos objetos de clase.
Este es solo un uso muy vago de la pila en GC. Actualmente, la mayoría de las JVM están utilizando un GC generacional. Este artículo ofrece una breve introducción sobre Java GC. Y recientemente leí un artículo muy bueno sobre el GC en .net. El GC on oracle jvm es bastante similar, así que creo que también podría ayudarte.