¡increíble! ByteDance Android post preguntas clásicas de la entrevista, la batalla final

comenzando

Los internautas suelen hacer dos preguntas en Zhihu Q&A: "¿Existe alguna posibilidad de aprender sobre desarrollo móvil ahora?", "¿Qué más se puede estudiar en desarrollo?". Los internautas respondieron: "Ahora todavía estoy aprendiendo sobre desarrollo móvil, como unirme al ejército nacional en el 49". De hecho, estas dos preguntas corresponden al mismo fenómeno. Ya sea que se esté preparando para ingresar a la industria o simplemente ingresando a la industria, o un desarrollador relativamente senior, el futuro de la carrera de desarrollo móvil, Hay cierta confusión, cierta ansiedad. ¿Por qué está pasando esto?

Entrevistador : Hábleme del mecanismo de recolección de basura

Yo: ... puedo resolver el problema de la referencia circular del conteo de referencias combinando el conteo de referencias fuerte y débil. De hecho, el puntero inteligente de Android se implementa así ...

Puntero inteligente

Los punteros inteligentes se utilizan ampliamente en todo el proyecto de Android. Puedes ver referencias de los tipos sp y wp en el código fuente relacionado con el binder:

 sp<IBinder> result = new BpBinder(handle);

 wp<IBinder> result = new BpBinder(handle);

sp es una referencia de puntero fuerte; wp es una referencia de puntero débil.

En Java, no necesitamos preocuparnos por la destrucción de objetos y la liberación de memoria. El mecanismo de GC identificará y reciclará automáticamente los objetos inútiles, y los punteros inteligentes son una pequeña implementación de GC en la capa nativa.

Los punteros inteligentes identifican objetos inútiles mediante el recuento de referencias. Los objetos que usan punteros inteligentes deben heredar de RefBase. RefBase mantiene el número de referencias fuertes y referencias débiles de este objeto.

El puntero fuerte sp sobrecarga el operador "=". Cuando se hace referencia a otros objetos, el recuento de referencias fuertes es +1 y el recuento de referencias fuertes es -1 en el destructor sp. Cuando el recuento de referencias fuertes se reduce a 0, la referencia El objeto es destruido Esto se da cuenta de la liberación automática del objeto.

Cuando un puntero débil se refiere a otros objetos, el recuento de referencias débiles es +1 y el recuento de referencias débiles es -1 en el destructor wp. Cuando el recuento de referencias fuertes es 0, el objeto referenciado se destruirá independientemente de si la referencia débil el recuento es 0 o no.

Cómo resolver el problema de referencia circular

Solo confiar en el método de recuento de referencias fuertes tendrá el problema de las referencias circulares, lo que hará que el objeto nunca se libere. Las referencias débiles se utilizan específicamente para resolver el problema de las referencias circulares:

Si A hace una fuerte referencia a B, entonces B necesita usar referencias débiles al hacer referencia a A. Al juzgar si es un objeto inútil, solo el recuento de referencias fuertes se considera 0, y el número de recuentos de referencias débiles no se refiere.

Esto resuelve el problema de que el objeto no se puede liberar debido a la referencia circular, pero esto causará el problema del puntero salvaje: cuando B quiere acceder a A a través de un puntero débil, A puede haber sido destruido, y el puntero débil a A se convierte en un puntero salvaje Arriba. En este caso, significa que A ya no existe, y se necesitan otras operaciones como la recreación

Reglas de personalización del puntero inteligente

Los punteros inteligentes no son fijos "cuando el recuento de referencias fuertes es 0, el objeto referenciado se destruirá independientemente de si el recuento de referencias débiles es 0", pero las reglas se pueden personalizar. RefBase proporciona el método extendObjectLifetime (), que se puede usar para establecer las reglas del contador de referencia. Las diferentes reglas tienen diferentes juicios sobre el momento de eliminar el objeto de destino, incluidas las siguientes tres reglas:

  • OBJECT_LIFETIME_STRONG: El objeto se destruirá solo cuando el valor del contador fuerte en el espacio de memoria de este objeto sea 0

  • OBJECT_LIFETIME_WEAK: el objeto se destruirá solo cuando los valores del contador fuerte y del contador débil en el espacio de memoria de este objeto sean ambos 0

  • OBJECT_LIFETIME_MASK: Independientemente de si los dos contadores son 0, el objeto no se destruye, es decir, es lo mismo que un puntero normal, o tienes que liberar manualmente el objeto por ti mismo

Al final

Comparta un sistema de ruta de aprendizaje avanzado para programadores de Android que han estado trabajando durante más de 1 a 5 años, con la esperanza de poder conocer a aquellos que todavía están comprometidos con el desarrollo de Android pero que no saben cómo mejorar y siguen confundidos.

  • Mapa mental técnico del arquitecto de Android de nivel Alibaba P7; Verifique si hay fugas y cubra las vacantes, y el estudio y la mejora sistemáticos en profundidad ( haga clic en mi GitHub para obtener más detalles )

  • ** Conjunto completo de videos sistemáticos de arquitectura de alto nivel; ** Siete módulos de tecnología principal, video + código fuente + notas

Si necesita estructurar el mapa de notas de estudio, puede hacer clic en mi GitHub para recibir

Hay muchos expertos técnicos y expertos en el grupo. Si tiene alguna pregunta, puede comunicarse con todos los internautas. El grupo aún comparte materiales de video de aprendizaje de Android de alto nivel y materiales de entrevistas de forma gratuita de vez en cuando ~

Hay muchos expertos técnicos y expertos como la nube. Si tiene alguna pregunta, puede comunicarse con todos los internautas. El grupo también comparte materiales de video de aprendizaje de Android de alto nivel y materiales de entrevistas de forma gratuita de vez en cuando ~

Supongo que te gusta

Origin blog.csdn.net/CHAMPION8888/article/details/112784787
Recomendado
Clasificación