Algoritmo gráfico de basura, No, algoritmo de recolección de basura

Objeto de vida y muerte


Hoy no es para presentarte el objeto , te presentaré la basura, porque la basura ocupará la memoria y hay que limpiarla ¡Hoy hablaremos de la forma en que la JVM recicla la basura! En primer lugar, veamos el ciclo de vida del objeto.

image.png

Primero explica algunos sustantivos:

  • Cenozoico: crecimiento rápido y almacenamiento de objetos relativamente jóvenes.
  • Generación antigua: almacena objetos más antiguos.
  • Surviror: después de recuperar la nueva generación de memoria, contiene los objetos supervivientes restantes, que se dividen en el área Desde y hasta el área de memoria.


Los objetos recién nacidos están en el área del Edén. Cuando el área del Edén está llena, los objetos grandes no se pueden acomodar y se activará el GC. Si el objeto todavía está vivo, el objeto pequeño ingresa al área De o al área de. dos áreas están vacías. Supongamos ahora que el objeto cargado es el área de origen, luego todos los objetos en el área de origen se copiarán al área de origen después de GC, y el área de origen se borra, la edad del objeto sobreviviente aumentará en un año , y cuando el objeto alcanza cierta edad, entrará en la vejez. Si el objeto es relativamente grande, Surviror no puede encajar y pasará directamente a la vejez. Si la vejez tampoco puede caber, se informará un error: desbordamiento de la memoria del montón .

Después de una breve introducción al ciclo de vida de la basura, echemos un vistazo al algoritmo de limpieza de basura.


Recuento de referencias


¿Cómo determina el método de recuento de referencias que un objeto es basura? Depende de si hay una referencia al objeto. El método de recuento de referencias significa que si un objeto tiene 1 contador de referencia es 1 y 2 contadores de referencia son 2, si no hay referencia, el contador es 0, que es un objeto basura. La desventaja es que los objetos se refieren entre sí y los objetos no se pueden reciclar . Dibuja un caso sencillo.

image.png

Como se muestra en el código anterior: el maestro tiene su propia referencia y la referencia del estudiante, el contador es 2, el estudiante tiene su propia referencia y la referencia del profesor, el contador es 2, esto se llama referencia mutua y, en última instancia, conduce a la El objeto del maestro o alumno no se puede reciclar. Así que ahora el recolector de basura generalmente no usa el método de conteo de referencias.


Marcar y barrer


Mark-clear se divide en dos pasos: el subproceso GC primero marca los objetos alcanzables y, cuando ocurre GC, borra los objetos inalcanzables. La desventaja es la fragmentación de la memoria después de la recuperación.image.png

如上图,我们知道分配内存都是连续的,垃圾对象回收后,内存很不规则,不利于内存使用效率。垃圾对象是不可达的?那什么叫可达对象呢,什么叫不可达对象呢?

  • 可达对象:从根引用搜索,能达到的对象叫可达对象,如绿色存活对象叫可达对象。如果从根引用搜索,
  • 不可达对象:不能达到的对象叫不可达对象。如黄色部分,就是垃圾对象,特别注意:此黄非彼黄。
  • 引用:也叫GC root,存放在栈中,指向堆的引用,一般用参数或者局部变量表示。

理论性的东西还是比较难理解,我们画图表示下。

image.png

假设:new Object()对应的堆地址是0xJL。

Object object = new Object(); 栈object引用指向new Object()对应的0xJL地址,new Object()对象可达,其中object就叫做根对象

object = null; 告诉gc线程,没有引用指向0xJL了,那这块内存就有可能被标记为垃圾对象。


复制算法


复制算法需要将一块空白的内存一分为二,GC后,将可达对象全部移动到另一块内存。新生代对象朝生夕死,GC后将活着的对象移动到另一块空内存,并将当前使用的内存清空。每次GC,循环往复。

image.png

如上图:新生代采用复制算法,GC回收前使用from区域,GC后使用to内存区域。


标记整理法


标记整理算基于标记清除算法做了一定优化,gc线程首先从根节点开始标记可达对象,并将可达对象压缩到内存顶部,最后清除边界区域,老年代对象生命周期长,比较适用于标记整理算法。

image.png

Como se muestra arriba: cuando la vejez esté completa, se activará Full GC para comprimir y organizar la memoria.


para resumir


El dibujo explica el significado y las deficiencias de varios algoritmos de GC. Espero que te sea de ayuda. Si quieres, dale me gusta y presta atención. Punto de atención, no se pierdan, me llamaron número público [de práctica ] , la Micro Señal [jiaolian123abc] les decía mientras practicaba.



Supongo que te gusta

Origin blog.51cto.com/14883474/2664455
Recomendado
Clasificación