Red de conocimiento informático - Aprendizaje de programación - ¿Qué tipo de hábitos de programación se pueden desarrollar en Java para beneficiar a GC?

¿Qué tipo de hábitos de programación se pueden desarrollar en Java para beneficiar a GC?

Autor: RednaxelaFX

Enlace: /question/48059457/answer/113538171

Fuente: Zhihu

Los derechos de autor pertenecen al autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.

¿Qué tipo de hábitos de programación en Java son propicios para GC? Si insiste en entrar en detalles, debe combinarlo con la implementación de JVM específica para analizar, porque cada JVM o incluso cada implementación de GC es la misma. JVM tendrá características diferentes.

Pero el consejo general que suele funcionar es simple:

Escribe código que sea sencillo e intuitivo, sin trucos. El diseño excesivo y demasiadas capas de encapsulación/abstracción a menudo hacen que el GC sea incómodo (lo que genera más objetos que deben procesarse).

Comprenda: GC es un socio, no un sirviente. Si bien se mantiene el código bien estructurado, intuitivo y fácil de entender, siempre es bueno reducir la asignación innecesaria de objetos.

No llame a System.gc() lt; puede afectar las estadísticas de GC y decisiones futuras.

No use "grupo de objetos" arbitrariamente lt: use el grupo de objetos para optimizar; GC A menudo es muy perjudicial. Generalmente es deseable utilizar un grupo de objetos para otros fines útiles, como mantener recursos cuya inicialización es costosa.

Por lo general, no necesita preocuparse por configurar null en las variables locales lt; el portal al principio tiene una explicación detallada.

Tenga cuidado al usar ThreadLocal, especialmente cuando se usa con a thread pool lt: si utiliza un grupo de subprocesos para ejecutar tareas y estas tareas escriben datos en ThreadLocal, debe prestar atención a borrar ThreadLocal cuando se completa la tarea; de lo contrario, es fácil tener fugas

Si utiliza memoria fuera del montón para implementar el almacenamiento en caché de objetos Java y si los objetos Java serializados se almacenan en la memoria fuera del montón, tenga cuidado con la sobrecarga de deserialización y la sobrecarga que conlleva la creación frecuente de objetos.

Si se usa NIO en el programa, preste atención al uso de DirectByteBuffer; por ejemplo, si System.gc() está deshabilitado y el programa está sintonizado para que la frecuencia de GC sea muy baja, está muerto. Es posible que DirectByteBuffer no se publique a tiempo. Consulte el punto 1 de este portal: [HotSpot VM] Varios errores de los "parámetros estándar" en el ajuste de JVM

Verifique y analice periódicamente los registros de GC (o use otros métodos, como JMX, para realizar un monitoreo similar) ) lt; - Si no hay ningún problema, no optimice aleatoriamente. Si hay un problema, encuéntrelo y analícelo a tiempo

Acerca de GC es un socio, no un servidor: esto significa que aunque. Es muy raro que el GC en sí tenga errores. Esto puede provocar pérdidas de memoria, pero en términos generales, se puede confiar en que el GC de la JVM recolectará todos los objetos basura que el programa no necesita. Pero este debería ser un modelo de comunicación bidireccional (socios), no un modelo unidireccional de emisión de órdenes (sirvientes). Podemos escribir un programa y el GC sabrá qué objetos recopilar, a su vez, el GC nos dará retroalimentación (registros de GC, monitoreo JMX, etc.) para decirnos cómo se está desempeñando y si necesita nuestra ayuda para mejorarlo; actuación.