tutorial paneles example create java garbage-collection

paneles - table swing java



Colecciones de basura mayor y menor de Java (2)

He estado leyendo sobre la recolección de basura en Java y SO Q&A pero estoy confundido acerca de los tipos de recolección de basura.

Tomemos como ejemplo el colector de rendimiento. (también conocido como colector paralelo). Los documentos dicen que utiliza varios subprocesos para realizar las colecciones secundarias y un único subproceso para las colecciones principales (igual que el recopilador en serie).

Ahora mis preguntas:

  1. ¿Qué significa un GC completo: a) ¿Significa que se han realizado las colecciones Menor y Mayor? O b) Full GC == Major Collections? ¿Cuál es?
  2. Si a), ¿significa que la Colección Menor aún se realiza utilizando varios subprocesos mientras que la Mayor se realizó utilizando Único?
  3. Si b), ¿significa que tanto las Generaciones Jóvenes como las Antiguas fueron eliminadas utilizando un solo hilo?

Además, 4. ¿Full GC solo afecta a OldGeneration o YoungGeneration también?

Gracias por adelantado.


Dejame explicar.

Tomemos como ejemplo el colector de rendimiento. (también conocido como colector paralelo). Los documentos dicen que utiliza varios subprocesos para realizar las colecciones secundarias y un único subproceso para las colecciones principales (igual que el recopilador en serie).

Aquí hay algo que entender. De forma predeterminada, en la mayoría de los sistemas más nuevos, JVM usa DOS recolectores de basura diferentes para generaciones jóvenes y viejas. En mi máquina: tengo un nuevo colector paralelo para la generación joven y un colector de barrido y barrido concurrente para la generación anterior.

La recolección menor se activa cuando la JVM no puede asignar espacio para un nuevo objeto (Recuerde: los nuevos objetos siempre se asignan en el área del Edén de la generación joven).

Próxima pregunta:

¿Qué significa un GC completo: a) ¿Significa que se han realizado las colecciones Menor y Mayor? O b) Full GC == Major Collections? ¿Cuál es?

y,

Además, 4. ¿Full GC solo afecta a OldGeneration o YoungGeneration también?

Depende. JVM reporta cada colección principal como GC completa. [Prueba con estas banderas java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp ]. La definición pedante es que Full GC ejecuta Minor primero seguido de Major (aunque el orden podría cambiarse si la generación anterior está llena, en cuyo caso se libera primero para permitirle recibir objetos de la generación joven).

OK, volvamos al punto. JVM considera la Colección principal [en la generación anterior (o Perm)] como GC completa. A continuación se muestran los resultados de un programa que pude escribir rápidamente para ilustrar el punto. La primera línea es Minor GC y la segunda es Major (Full) GC. Puede ver que solo sucedió en la generación más antigua (CMS) y pudo reducir la generación anterior de 1082K a 1034K.

  • 11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  • 17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

Próxima pregunta:

Si a), ¿significa que la Colección Menor aún se realiza utilizando varios subprocesos mientras que la Mayor se realizó utilizando Único?

Sí. Ver el principio de mi respuesta. Las generaciones jóvenes y mayores son atendidas por diferentes coleccionistas. Para Young Generation, puedes usar cualquiera de los siguientes:

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:+UseParNewGC

Para Old Generation, las opciones disponibles son:

  • -XX:+UseParallelOldGC
  • -XX:+UseConcMarkSweepGC

Si bien la respuesta de goblin sigue siendo correcta a grandes rasgos, al menos esta parte ahora está desactualizada:

Depende. JVM reporta cada colección principal como GC completa.

Tanto CMS como G1 distinguen entre colecciones de nueva generación (secundarias), colecciones concurrentes de la generación anterior y gcs completos. Estos últimos son una especie de último recurso y la mayor parte de la GCing debe ser manejada por colecciones de nueva generación y concurrentes.