example español collector algoritmos garbage-collection jvm

garbage-collection - español - garbage collector php



¿Qué mecanismo utiliza JVM para bloquear subprocesos durante la pausa de parada del mundo? (1)

Al menos para HotSpot y OpenJDK, la JVM usa puntos seguros para detener el flujo de la aplicación en cada subproceso, ya sea introducida en el código JIT o cambiando las asignaciones de código de bytes para el código interpretado (consulte esta publicación de Alexey Ragozin para obtener más detalles).

Ver también esta respuesta de Gil Tene sobre por qué la seguridad en la seguridad puede ser un problema adicional cuando se trata de hacer una pausa en el mundo.

Aquí hay más detalles (según los entiendo, no pretendo ser un experto) sobre el mecanismo de seguridad en Hotspot / OpenJDK (ver por ejemplo safepoint.cpp , línea 154), basado en los recursos anteriores y, probablemente, en algunos artículos de Cliff Click en el blog de Azul Systems (que parece haber desaparecido del sitio).

Alcanzando el punto de seguridad

La JVM necesita obtener el control del flujo de la aplicación, por lo que depende del estado actual de los subprocesos:

  • Obstruido

    La JVM ya tiene control de ese hilo.

  • Ejecutar código interpretado

    El intérprete ingresa a un modo (intercambiando su tabla de envío) donde cada evaluación de código de bytes será precedida por una verificación de punto de seguridad.

  • Ejecutando código nativo (JNI)

    El código JNI se ejecuta en un punto seguro y puede continuar ejecutándose, a menos que vuelva a llamar a Java o llame a algunos métodos JVM específicos, momento en el que se puede detener para evitar salir del punto seguro (gracias a Nitsan por los comentarios).

  • Ejecutando código compilado

    La JVM hace que una página de memoria específica (la página Sondeo de Safepoint) sea ilegible, lo que hace que las lecturas periódicas de esa página (insertadas en el código compilado por el compilador JIT) falle y vayan a un controlador de JVM.

  • Ejecución en la VM o estados de transición (en la VM también)

    De todos modos, el flujo pasa por la comprobación de punto de seguridad en algún momento, por lo que la máquina virtual la espera.

Parando en el punto seguro

Una vez que un hilo está en el punto de seguridad, controlado por la JVM, la JVM simplemente lo bloquea para que no pueda salir. Cuando todos los subprocesos se han detenido (es decir, el mundo se ha detenido), la JVM puede hacer la recolección de basura y luego liberar todos los subprocesos que reanudan la ejecución.

Para obtener más detalles, puedes leer este post del blog en puntos seguros escrito por Nitsan Wakart mientras tanto (que a su vez tiene más referencias).

Escuché esta pregunta en una entrevista y no pude dar una respuesta. Más tarde busqué en internet y aún no encontré una respuesta. ¿Alguien puede decirme cómo JVM detiene los subprocesos durante la pausa en la detención del mundo al recolectar basura y cómo se ejecutan nuevamente?