¿Cuál es el tamaño de stack predeterminado, puede crecer, cómo funciona con la recolección de basura?

Entiendo que cada hilo tiene su propia stack . Los tipos primitivos y las referencias se mantienen en la stack, y no se mantiene ningún objeto en la stack. Mis preguntas son:

  • ¿Cuánto puede crecer una stack? (como con los parámetros – Xms y – Xmx )
  • ¿Podemos limitar su crecimiento?
  • ¿La stack tiene un valor mínimo predeterminado y un valor máximo?
  • ¿Cómo funciona la recolección de basura en la stack?

¿Cuánto puede crecer una stack?

Puede usar una opción de VM llamada ss para ajustar el tamaño máximo de la stack. 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 stack en 1M.

Cada hilo tiene al menos una stack. Algunas máquinas virtuales Java (JVM) colocan la stack Java (llamadas al método Java) y la stack nativa (llamadas al método nativo en la máquina virtual) en una stack y realizan el desenrollado de la stack utilizando un marco administrado a nativo, conocido como M2NFrame. Algunas JVM mantienen dos stacks por separado. El Xss establece el tamaño de la stack de Java en la mayoría de los casos.

Para muchas JVM, ponen diferentes valores predeterminados para el tamaño de la stack en diferentes plataformas.

¿Podemos limitar este crecimiento?

Cuando ocurre una llamada a un método, se creará un nuevo marco de stack en la stack de ese hilo. La stack contendrá variables locales, parámetros, dirección de retorno, etc. En java, nunca puedes poner un objeto en la stack, solo la referencia del objeto se puede almacenar en la stack. Como array también es un objeto en Java, las matrices tampoco se almacenan en la stack. 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 stack. En realidad, el hecho de que no podamos poner objetos en la stack java afecta el rendimiento en algún momento (error de caché).

¿La stack 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 aquí .

¿Cómo funciona la recolección de basura en la stack?

Las recolecciones de basura en Java son un tema candente. La recolección de basura tiene como objective recolectar el objeto inalcanzable en el montón. Entonces eso necesita la definición de alcanzable. Todo en la stack consiste en parte de las referencias del conjunto raíz en GC. Todo lo que se puede acceder desde cada stack 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 stack 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.

Como dices, las variables locales y las referencias se almacenan en la stack. Cuando regresa un método, el puntero de la stack simplemente vuelve al estado anterior al inicio del método, es decir, todos los datos locales se “eliminan de la stack”. Por lo tanto, no se necesita recolección de basura en la stack, eso solo ocurre en el montón.

Para responder a sus preguntas específicas:

  • Vea esta pregunta sobre cómo boost el tamaño de la stack.
  • Puedes limitar el crecimiento de la stack 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 stack
    • limite el número de llamadas a función anidadas (generalmente al no usar recursividad)
  • Para Windows, el tamaño de stack predeterminado es 320k para 32bit y 1024k para 64bit, consulte este enlace .