create java memory caching heap objectpool

create - jtextfield java



¿Cómo hacer que la memoria de su aplicación Java sea eficiente? (11)

  1. Assign null valor Assign null a todas las variables que no longer utilizan. Así make it available for Garbage collection .
  2. De-reference the collections una vez que finalice el uso, de lo contrario, GC no las barrerá.

¿Cómo optimiza el uso del tamaño de pila de una aplicación que tiene muchos (millones) de objetos de larga duración? (gran caché, cargando muchos registros de una base de datos)

  • Utilice el tipo de datos correcto
    • Evite java.lang.String para representar otros tipos de datos
  • Evitar objetos duplicados.
    • Usa enumeraciones si los valores son conocidos de antemano
    • Usar grupos de objetos
    • String.intern () (¿buena idea?)
  • Cargue / guarde solo los objetos que necesita

Estoy buscando programación general o respuestas específicas de Java. No hay conmutador funky compilador.

Editar:

Optimice la representación en memoria de un POJO que puede aparecer millones de veces en el montón.

Casos de uso

  • Cargue un archivo csv enorme en la memoria (convertido en POJOs)
  • Utilice hibernación para recuperar millones de registros de una base de datos

Resumen de respuestas:

  • Usa un patrón de peso mosca
  • Copiar en escrito
  • En lugar de cargar objetos 10M con 3 propiedades, ¿es más eficiente tener 3 arreglos (u otra estructura de datos) de tamaño 10M? (Podría ser una molestia manipular los datos, pero si tiene poca memoria ...)

Asegure una buena normalización de su modelo de objeto, no duplique valores.

Ejem, y, si son solo millones de objetos, creo que solo iría por una VM decente de 64 bits y un montón de RAM;)


Dedique algo de tiempo a familiarizarse con las opciones de línea de comandos de la VM , y en particular a ajustarlas a la recolección de basura. Si bien esto no cambiará la memoria utilizada por sus objetos, puede tener un gran impacto en el rendimiento con aplicaciones que utilizan mucha memoria en máquinas con una gran cantidad de RAM.



Le sugiero que use un generador de perfiles de memoria, vea dónde se está consumiendo la memoria y optimice eso. Sin información cuantitativa, podría terminar cambiando algo que puede no tener efecto o empeorar las cosas.

Puede observar cambiar la representación de sus datos, especialmente si sus objetos son pequeños. Por ejemplo, podría representar una tabla de datos como una serie de columnas con matrices de objetos para cada columna, en lugar de un objeto por fila. Esto puede ahorrar una cantidad significativa de sobrecarga para cada objeto si no necesita representar una fila individual. por ejemplo, una tabla con 12 columnas y 10,000,000 filas podría usar 12 objetos (uno por columna) en lugar de 10 millones (uno por fila)


Los "perfiladores" normales no te ayudarán mucho, porque necesitas una visión general de todos tus objetos "vivos". Usted necesita un analizador de volcado de pila. Recomiendo el analizador de memoria Eclipse .

Compruebe si hay objetos duplicados, comenzando con cadenas. Comprueba si puedes aplicar patrones como flightweight, copyonwrite, perezoso inicialización (google será tu amigo).


No dice qué tipo de objetos está buscando almacenar, por lo que es un poco difícil ofrecer consejos detallados. Sin embargo, algunos enfoques (no exclusivos), sin ningún orden en particular, son:

  • Use un patrón de peso mosca siempre que sea ​​posible.
  • Caché al disco. Existen numerous soluciones de caché para Java.
  • Existe cierto debate sobre si String.intern es una buena idea. Vea here para una pregunta re. String.intern (), y la cantidad de debate en torno a su idoneidad.
  • Utilice referencias weak o weak para almacenar datos que puede recrear / recargar a pedido. Consulte here para here cómo utilizar referencias blandas con técnicas de almacenamiento en caché.

Saber más sobre las partes internas y la vida útil de los objetos que está almacenando daría como resultado una respuesta más detallada.


Quiero agregar algo al punto que Peter ya hizo (no puedo comentar sobre su respuesta :() siempre es mejor usar un generador de perfiles de memoria (ver el generador de perfiles de memoria de Java ) que ir por intution.80% de las veces es una rutina que nosotros ignore tiene algún problema en it.also las clases de colección son más propensas a las fugas de memoria.


Si tiene millones de enteros y flotadores, etc., vea si sus algoritmos permiten representar los datos en matrices de primitivos. Eso significa menos referencias y menor costo de CPU de cada recolección de basura.


Una elegante: mantener la mayoría de los datos comprimidos en RAM. Sólo expandir el conjunto de trabajo actual. Si tus datos tienen buena localidad que puede funcionar bien.

Utilizar mejores estructuras de datos. Las colecciones estándar en java son bastante intensivas en memoria.

[¿Qué es una mejor estructura de datos]

  • Si echa un vistazo a la fuente de las colecciones, verá que si se limita a cómo acceder a la colección, puede ahorrar espacio por elemento.
  • La forma en que la colección maneja el crecimiento no es buena para las colecciones grandes. Demasiado copiado. Para colecciones grandes, necesita un algoritmo basado en bloques, como btree.

Usted podría simplemente almacenar menos objetos en la memoria. :) Use una memoria caché que se derrame al disco o utilice Terracotta para agrupar su montón (que es virtual), lo que permite que las partes que no se utilicen se vacíen de la memoria y se vuelvan a colocar fallas de forma transparente.