2012-02-11 9 views
6

Entiendo que no hay forma de obtener el tamaño de pila de un hilo en Java en tiempo de ejecución (ver Can one obtain actual stack size used by a thread in Java after some time of running?).¿Por qué no hay un método para obtener el tamaño real de la pila?

Por ejemplo, si creamos un java.lang.Thread especificando un tamaño de pila de 64 * 1024, la JVM es libre para darnos un hilo con cualquier tamaño pila.

Sin embargo, creo que saber realmente el tamaño real de la pila es muy útil para ciertas aplicaciones que requieren este tipo de información.

¿Cuál es la razón por la que no tenemos un método que nos indique el número real de utilizado para la pila?

¿Hay algún tipo de limitación en la arquitectura que hace imposible obtener el número real de bytes para un hilo?

+1

"Sin embargo, creo que conocer realmente el tamaño real de la pila es muy útil para ciertas aplicaciones que requieren este tipo de información". ¿Tienes algún ejemplo? –

+0

@MarkByers Por ejemplo, un servidor web o un sistema operativo. – Pacerier

+2

¿Por qué un servidor web necesita saber el tamaño de la pila? – Bombe

Respuesta

3

Lo único que se almacena en la pila son los tipos primitivos y las referencias. Los objetos se crean siempre en el montón, por lo que los tipos de datos que se almacenan en la pila son

  • variables locales de tipo byte, char, int, long, float, el doble de la más larga de ellas son dobles, que es 8 bytes
  • Las referencias a objetos son de 4 bytes en vm 32 bits, 8 bytes en VMS 64 bits (posiblemente más corto, 48 referencias de bits se utilizan para ahorrar espacio)

Tenga en cuenta que las matrices son objetos tipos por lo que se almacenan en el montón, también si tiene una primitiva que es un campo en una clase, entonces la primitiva es parte de un objeto y, por lo tanto, se almacenará en el montón.

Así que es bastante difícil quedarse sin espacio en la pila para un hilo a menos que tenga recursión en la pista. Me imagino que esa es la razón por la cual los diseñadores de Java no te dan una manera de averiguar el tamaño de la pila.

Otra razón para no dar el tamaño de pila es que sería un detalle de implementación con el que no se puede hacer nada, no se puede cambiar el tamaño de una pila de subprocesos después de haber creado el subproceso, y no se puede hacer la aritmética del puntero, entonces, ¿qué sentido tiene conocer el tamaño de la pila?

+0

Soy un grupo de subprocesos, quiero crear 30 subprocesos cuando soy nacido, cada uno con un tamaño de pila de 64 Kb.Sin embargo, si la JVM ignora mi solicitud de tamaño de pila y crea cada subproceso con un tamaño de pila de 1Mb, entonces no deseo crear 30 subprocesos. Si cada subproceso tiene un tamaño de pila de 512 Kb, en su lugar crearía 15 subprocesos. De lo contrario, si cada subproceso tiene un tamaño de pila de 1Mb, en su lugar crearía 10 subprocesos (y así sucesivamente). Sin embargo, no hay forma de que consulte el tamaño de la pila, y lo mejor que puedo hacer ahora es suponer. – Pacerier

+0

@Pacerier el tamaño de la pila es muy pequeño en relación con el tamaño del montón, por lo tanto, el problema de tener más hilos no es el tamaño de la pila de una hebra individual sino la cantidad de memoria heap utilizada por cada hebra. Cuantos más hilos, más montón necesitarás. ¿Qué tipo de hardware se dirige para ejecutar su aplicación porque le preocupa el KB de memoria? – ams

+0

Estoy entendiendo mal algo, porque los hilos no ocupan ningún montón de memoria por sí mismos. Si tengo 10 instancias de MyThreadPool y cada MyThreadPool tiene 30 subprocesos y cada subproceso tiene un tamaño de pila de 1Mb, que es un total de 300Mb de memoria. Por otro lado, si cada subproceso tiene un tamaño de pila de 64 Kb, solo necesitaría una memoria de 18.75 Mb. Eso es una gran diferencia incluso con una computadora superior al promedio – Pacerier

Cuestiones relacionadas