¿Dónde puedo encontrar el valor predeterminado -Xss (tamaño de pila) para Oracle JVM?

¿Alguien ha encontrado alguna vez un solo documento JVM con una lista predeterminada? -Xss valores para varias versiones de Oracle JVM y para diferentes sistemas operativos?

He podido encontrar esta tabla en el documentos jrockit, pero eso no es útil para quienes usan la JVM de Oracle "normal".

Aprecio que el -Xss El valor variará según el sistema operativo (y la versión de JVM), por lo que tal vez no haya un documento que enumere todas las combinaciones recientes. Pero si alguno de los lectores conoce algún documento individual que enumere al menos solo los valores predeterminados -Xss valor por cada uno Versión JVM (o al menos 1.6 y 1.5), o incluso si solo es para algo OS, sería un gran comienzo. Estoy especialmente interesado en el predeterminado para Windows.

Agregaré que la razón por la que esto es valioso es que a menudo vemos que las personas recomiendan (erróneamente, creo) que alguien puede resolver un problema cambiando el -Xss valor. Pero si no conoce su valor predeterminado, entonces no hay forma de saber si está aumentando o disminuyendo el valor mediante cualquier cambio que alguien recomiende. Por lo general, no indican la versión / sistema operativo en el que se encuentran, por lo que es un disparate si su sugerencia lo "ayudará".

Incluso mejor que alguna documentación, si alguien conoce una forma de consultar la JVM para obtener el valor actual, ya sea desde la línea de comandos o mediante una llamada a la API, eso sería aún más valioso. Gracias.

Actualización: he agregado una respuesta mía que resume las diversas sugerencias y apunta a un recurso actual (a principios de 2021) que indica la respuesta, incluido lo que aprendí sobre el -Xss valor en Windows.

preguntado el 16 de mayo de 11 a las 16:05

Gracias, Sean, pero te das cuenta de que solo se aplica a 1.4. Tenga en cuenta que había pedido referencias para 1.5 o 1.6. Esos están resultando más difíciles de encontrar. Lo siento, debería haber indicado que estaba al tanto de esa nota técnica 1.4, al igual que hice referencia a la nota jrockit 1.5. -

6 Respuestas

tratar:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

Respondido el 05 de diciembre de 14 a las 23:12

eso parecía prometedor (y para el usuario de Windows, usaría buscar "ThreadStackSize" en su lugar), pero simplemente informa 0 como el valor de ThreadStackSize. No espero que eso signifique que el tamaño es 0. Y aunque algunos pueden decir que esto indicaría que está usando "el valor predeterminado", eso simplemente nos lleva de vuelta a mi pregunta: ¿qué diablos es el valor XSS predeterminado en un dado JVM? No puedo creer que esto todavía no pueda responderse en 3.5 años. Todavía abierto a todos los interesados, y gracias a todos los demás por intentarlo hasta ahora. - charlie arehart

¡Gracias! Esto es lo que obtuve para Linux de 64 bits: java -XX: + PrintFlagsFinal -version | grep ThreadStackSize intx CompilerThreadStackSize = 0 {producto pd} intx ThreadStackSize = 1024 {producto pd} intx VMThreadStackSize = 1024 {producto pd} versión java "1.6.0_24" Java (TM) SE Runtime Environment (compilación 1.6.0_24-b07) - escocés

@Rohit, el tamaño se almacena en kbytes: bugs.openjdk.java.net/browse/JDK-8145458 - Julien

Casi cinco años tarde en la fiesta ... Usando java -XX:+PrintFlagsFinal -version muestra que ThreadStackSize debería ser 1024k, pero en realidad parece ser 64Mb, como se muestra en /proc/<pid>/maps. Y si, cambiando -Xss a, por ejemplo, 4Mb (java -Xss4m) y comparando /proc/<pid>/maps confirma que "algo", que supongo que son asignaciones de pila de subprocesos, disminuyó de 64Mb a 4Mb. Usé esta pequeña herramienta para mostrar los tamaños de los segmentos de memoria, gist.github.com/cosimo/e90a9f6daa1fbdc62a89843cf27f005a Por último, para mostrar los indicadores de JVM de un proceso en ejecución, utilice jcmd <pid> VM.flags en lugar de. - Cosimo

Esta información ahora aparece en las preguntas frecuentes de Oracle Hotspot http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom

Es posible que tenga un problema con el tamaño de pila predeterminado para subprocesos. En Java SE 6, el valor predeterminado en Sparc es 512k en la VM de 32 bits y 1024k en la VM de 64 bits. En x86 Solaris / Linux es 320k en la VM de 32 bits y 1024k en la VM de 64 bits.

En Windows, el tamaño de pila de subprocesos predeterminado se lee del binario (java.exe). A partir de Java SE 6, este valor es 320k en la VM de 32 bits y 1024k en la VM de 64 bits.

Puede reducir el tamaño de la pila ejecutando la opción -Xss. Por ejemplo:

java -server -Xss64k

Tenga en cuenta que en algunas versiones de Windows, el sistema operativo puede redondear el tamaño de la pila de subprocesos utilizando una granularidad muy gruesa. Si el tamaño solicitado es menor que el tamaño predeterminado en 1K o más, el tamaño de la pila se redondea al valor predeterminado; de lo contrario, el tamaño de la pila se redondea a un múltiplo de 1 MB.

64k es la cantidad mínima de espacio de pila permitida por subproceso.

Respondido el 11 de diciembre de 13 a las 13:12

Gracias, Ben. Esa es la respuesta potencial más directa hasta el momento, pero hay un pequeño problema: esa nota técnica parece referirse a versiones anteriores de Java ("1.4" y "SE 5.0" y "SE 6"). Es muy posible que la información ya no sea precisa para Java 7 u 8. Las personas interesadas en los detalles deben tomar nota de eso. Pero por ahora parece confirmar que en Windows, la única forma real de saberlo es mirar la fuente. Bondad. (¡Al menos fue amable de su parte decir lo que era para Windows de 32/64 bits al menos a partir de Java 6!) - charlie arehart

Todavía estoy buscando alguna forma de que jvm informe el tamaño actual de la pila. No puedo creer que sea tan difícil de obtener, especialmente teniendo en cuenta todo lo anterior sobre incluso encontrar el valor predeterminado. Algunos pueden proponer jmx, pero he buscado en los documentos de la API de Java, sin éxito. Y algunos pueden proponer usar algo como 'java -XX: + PrintFlagsFinal | find "Stack" ', pero eso solo informa qué valor, si hay alguno, se especificó en los argumentos XX cuando se inició la JVM. NO informa el valor de algo dejado como predeterminado. - charlie arehart

Puedes encontrarlo en el sitio de Oracle en la opción "-XX: ThreadStackSize" que significa lo mismo que -Xss.

Respondido el 18 de junio de 13 a las 15:06

gracias por eso. Encuentro a otros afirmando y demostrando que xss y threadstacksize parecen ser lo mismo, solo nombres diferentes de diferentes épocas en la evolución de jvm. - charlie arehart

Pero en cuanto a la referencia de esa página a los valores predeterminados, es bastante obtusa en este caso. Sí, enumera -XX: ThreadStackSize = 512 en la columna de la izquierda, cuyo encabezado dice que la columna muestra "opción y valor predeterminado", pero luego la columna de la derecha dice "Tamaño de pila de subprocesos (en Kbytes). (0 significa usar el tamaño de pila predeterminado ) [Sparc: 512; Solaris x86: 320 (era 256 antes en 5.0 y antes); Sparc 64 bit: 1024; Linux amd64: 1024 (era 0 en 5.0 y antes); todos los demás 0.] "Estoy interesado en Windows principalmente, pero no sé qué significa "todos los demás 0", cuando la primera oración dice "0 significa usar el tamaño de pila predeterminado". :-( - charlie arehart

Según la columna de la izquierda y su título 512 es el predeterminado. Entonces 512 es para Windows. - pulsación de tecla

Pulsación de tecla, no, no fue así. el 512 de hecho aparece en la columna izquierda de esa página como el "predeterminado", pero nada acerca de esa página decía que mostraba los valores predeterminados para Windows. Entonces, esa caja para threadstacksize mostraba cosas DIFERENTES a Windows. Y, de hecho, Windows estaría en su clasificación de "todos los demás", mostrando "0", que como se discutió en otra parte aquí significa "cualquiera que sea el sistema operativo predeterminado", lo que nuevamente no nos dice nada. - charlie arehart

FWIW, esa página (esa tecla compartida) tiene un enlace en la parte superior para un documento sobre Java 8 para Windows (docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html), y ESA página al menos decía esto sobre xss: "El valor predeterminado depende de la memoria virtual". Una vez más, eso no ayuda, pero al menos fue un intento. Vuela en contra de otras discusiones aquí (otras respuestas y comentarios) donde algunos señalaron que la fuente de Java indicaría el tamaño predeterminado. Ofreceré una nueva respuesta que apunta a un recurso de Java 11 que va un poco más allá (solo un poco). - charlie arehart

Hay valores predeterminados disponibles en la guía del usuario de IBM Java 6 (fuente):

Xss para Java Threads de 32 bits:

AIX®: 256KB
IBM®I: 256KB
Linux: 256KB
Windows: 256KB
z/OS®: 256KB

Respondido 29 ago 12, 18:08

Gracias, chepseskaf, pero de nuevo preguntaba (en el título y en el cuerpo) sobre Oracle / Sun JVM. De hecho, su recurso proviene de IBM JVM, que no es el mismo. Entonces, si bien la información es interesante, no podemos concluir que se aplique también a Oracle / Sun JVM. - charlie arehart

Para hotspot, depende de su arquitectura y de lo que no.

El tamaño de pila predeterminado se puede encontrar en el código fuente en los archivos de encabezado que se relacionan con una plataforma determinada, por ejemplo

búsqueda de código de google (editar: este servicio se ha desactivado desde que se hizo esta respuesta, lamentablemente) ACTUALIZACIÓN: aquí hay un nuevo enlace de Nebelmann: Fuente de Openjdk: globals_windows_x86.hpp

No estoy seguro de si esto ayuda, pero es un comienzo.

Respondido 29 Oct 13, 12:10

Interesante, Greg e Inger. Supongo que algunos pueden querer explorar su fuente de Java para encontrarlo, pero como muchos implementan el JDK o JRE sin fuente, eso no los ayudará (a menos que lo obtengan de nuevo, o encuentren recursos como los que compartió, y espero que encuentren el fuente allí para su entorno específico.) Y sí, Greg, había reconocido desde el principio que esto sería realmente específico del entorno. Aún así, gracias a ambos por las cosas a considerar. - charlie arehart

Qué viaje tan largo y extraño ha sido para responder a esta pregunta, publicada por primera vez en 2011, y obteniendo todo tipo de respuestas en los años posteriores. Algunos propusieron usar el -XX:+PrintFlagsFinal Argumento JVM, que puede ser el mejor para la mayoría, pero no ayudó para Windows (siempre informa 0). Y algunas personas compartieron varios recursos (para varias JVM y versiones), algunos de los cuales intentaron ayudar a responder esta pregunta pero a menudo no lo hicieron, o no aclararon para aquellos que pueden estar ejecutando una JVM de Oracle en Windows.

Aquí hay al menos un poco más de claridad: dado que Java 11 es (en 2021) la última versión actual LTS (versión de soporte a largo plazo) de Oracle JVM, encontré un documento para esa versión actual que SÍ enumera los valores predeterminados específicos para XSS (también conocido como ThreadStackSize) y para diferentes sistemas operativos. Está en https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE. Esto es lo que informa (en caso de que ese enlace se rompa en el futuro):

  • Linux / x64 (64 bits): 1024 KB
  • macOS (64 bits): 1024 KB
  • Oracle Solaris / x64 (64 bits): 1024 KB
  • Windows: el valor predeterminado depende de la memoria virtual

Lamentablemente, la gente de Windows todavía se pregunta: ¿qué podría significar "depende de la memoria virtual"? Supongo que significa la memoria virtual de Windows, por supuesto, pero incluso entonces, ¿cómo traducimos eso en lo que deberíamos esperar que sea el tamaño de pila real para un subproceso jvm?

Y volviendo a mi pregunta original: quería saber qué tu préstamo estudiantil era, porque muy a menudo alguien podría sugerir que la solución a algún problema es cambiar eso -XSS jvm arg (a algún valor que propondrían). Pero, ¿cómo podemos saber si lo estamos haciendo más grande o más pequeño que el predeterminado? Dependiendo del problema que se resuelva, ¡puede ser vital saberlo!

Después de 10 años, supongo que es una búsqueda mítica que puede que no se concluya. Pero quién sabe, tal vez alguien que vea esto ahora o en el futuro pueda acudir al rescate con nueva información. O quizás Java 17 (la próxima versión LTS esperada) puede cambiar las cosas. (Para ser claros, no hay una versión de esa página que compartí, para Java 13 o superior, mientras escribo).

Si nada más, dejo esto para la posteridad, para al menos ayudar a alguien más que enfrenta esta pregunta a saber que no está loco por encontrar tan difícil obtener una respuesta directa (especialmente sobre el valor predeterminado de XSS para Windows, y si cambiar sería aumentar o reducir el tamaño en relación con el predeterminado).

respondido 05 mar '21, 21:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.