2012-06-14 11 views
19

he observado lo siguiente de una página web: La memoria de la JVM HotSpot se divide entre 3 espacios de memoria:¿dónde se asigna la pila de Java?

  • El montón de Java
  • El (generación permanente) PermGen espacio
  • El nativo Montón (C- Heap)

¿Dónde se asigna la pila en HotSpot JVM? En montón nativo?

actualización: otra información de referencia: Para una de 64 bits VM, la capacidad C-Montón = servidor físico RAM & total de memoria virtual - montón de Java - PermGen

+3

Dondequiera que la implementación lo asigne ... –

+0

Tenga en cuenta que el código de Java se puede ejecutar bajo un compilador JIT, que también podría cambiar eso. –

+0

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

Respuesta

25

La respuesta es:

  1. Depende de la implementación.

  2. 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".

  3. 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.)

+0

si es así. ¿Puedo pensar que el hilo de Java se asignará en el montón nativo? Debido tanto al montón JVM como al espacio PermGen, se debe usar para uso especial. – jiafu

+1

No puede pensar en nada, es un detalle de implementación. –

+0

Soy interesante en eso. nada de eso. ¿donde es? – jiafu

2

Si puede encontrar acceso a esas cosas de cualquier manera, el segundo Sol (u Oracle) ahora es adays?) lanzará un parche rápidamente.

Poder acceder a ese tipo de cosas es un GRAN riesgo de seguridad. Muchos sistemas para grandes empresas usaban Java. Dejar un agujero donde sea posible rastrear el espacio de asignación no sería posible.

como anteriormente, MMAP asignará espacio y lo devolverá para el programa y los requisitos de espacio necesarios. Hago muchas cosas con MMAP casi todos los días.

Tal vez porque creo que es un poco más oscuro cómo se pueden usar las cosas (para proteger mejor mis sistemas), estoy seguro de que hay una solución para cancelar su trabajo o si tiene la Policía Mundial de Team golpeando a su puerta sospechando que usted tiene actos delictivos, y en el proceso confiscar todo su equipo.

Cuestiones relacionadas