La respuesta es:
Depende de la implementación.
En la implementación que analicé, la asignación de subprocesos fue manejada por la biblioteca de subprocesos C nativa estándar, y parecía que la biblioteca iba al OS para asignar un segmento de memoria para la pila. Entonces "ninguno de los anteriores".
Puede confirmar esto profundizando en el código fuente OpenJDK relevante para su plataforma.
ACTUALIZACIÓN
De una vieja cuestión, aquí está el fragmento de código de pthread_create
que solicita la asignación de la pila de subprocesos. Este método usó mediante la implementación de subprocesos de JVM para crear el subproceso nativo.
mmap(0, attr.__stacksize,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
Como se puede ver, sólo se utiliza la llamada mmap
sistema para solicitar un segmento de memoria del sistema operativo. Como dije en un comentario, este NO es el montón de Java normal, NO el montón de Permgen, y NO el montón nativo de C. Es un segmento de memoria solicitado específicamente desde el sistema operativo.
Como referencia, aquí hay un enlace a la mmap syscall manual entry.
actualización otra información de referencia: Para una de 64 bits VM, la capacidad C-Montón = servidor físico RAM total & la memoria virtual - montón de Java - PermGen
OMI, que es una simplificación excesiva. (Y proporcione un enlace donde encontró esta información ... para que podamos leerla en su forma original.)
Dondequiera que la implementación lo asigne ... –
Tenga en cuenta que el código de Java se puede ejecutar bajo un compilador JIT, que también podría cambiar eso. –
La pila se puede asignar a cualquiera de los tres espacios de memoria, dependiendo de la implementación de la JVM (es decir, Oracle y Apple desarrollan implementaciones diferentes de Java). – Vulcan