Cómo utilizar la memoria virtual (de intercambio en el sistema de archivos de Linux) en la programación Java Web

StackOverflow https://stackoverflow.com/questions/1506634

Pregunta

Trabajo en aplicaciones Web Java. En algún tramo que utilizo muy grande variable de árbol que guardar y persisten en la memoria (RAM). Puedo migrar este a la memoria virtual (swap). Nota: enorme árbol consisten nombre y correo electrónico para todos los usuarios que utilizan en la sugerencia Ajax cuadro de texto.

¿Fue útil?

Solución

No hay una forma estándar de Linux de forzar a un bloque de memoria para intercambiar, por tanto, la JVM no tendrá una forma de pedir el sistema operativo para llevar a cabo tal tarea.

Lo mejor que puede hacer si se desea esta funcionalidad, es serializar el árbol y escribir los datos en bruto a un archivo de disco luego traerlo de vuelta cuando esté listo para ello.

Sin embargo, es probable que no quiere esto, porque la escritura en un disco es muy lenta en comparación con la memoria física de E / S.

El caso en cuestión, dejar que el sistema operativo se preocupe por esto. Es seguro asumir que sabe una mejor manera de gestionar la memoria de lo que hacen.

Otros consejos

Deja que el sistema operativo de su usuario está utilizando tienen cuidado de esto.

Una imagen de Java en ejecución que parcialmente fuera de las páginas de intercambio es una imagen de java muertos. Tan pronto como un ansiosos patadas GC suficientes en, se llega a la página todo de nuevo. La página es bastante malo. Si en realidad no tiene suficiente memoria RAM para toda la cosa, se termina con una paliza, no responde naufragio de un servidor. Paginado Java es malo (tm).

Si usted tiene suficiente memoria RAM para toda la cosa, que no necesita de intercambio en absoluto.

cosas en su lista a una tabla de base de datos, en el disco, índice que, limitar los conjuntos de resultados, y hacer las consultas apropiadas en contra de ella. Va a ser una ganancia neta, y la base de datos puede almacenar en caché las páginas que más le gustan, por lo que no tiene que pensar en ello.

O más RAM.

Su sistema operativo gestiona automáticamente su propia memoria y empuja las cosas para el archivo de intercambio, según sea necesario.

Si usted tiene una gran cantidad de datos, es posible que desee considerar el almacenamiento de sus datos en una base de datos en lugar de un gran árbol en la memoria. Esto probablemente permitirá a su escala de aplicación mejor, y también puede mejorar el rendimiento -. Sin duda le daría un mejor rendimiento que la lectura y la escritura de toda la estructura en el disco cada vez que tiene que mirar hacia arriba o modificar un registro

Editar: Usted no necesariamente tiene que configurar una máquina de base de datos dedicada. Teniendo en cuenta que actualmente está tratando de almacenar todos los datos de la memoria en este momento, es probable que pueda utilizar una base de datos integrable como HSQLDB o SQLite, que tienen límites de tamaño de 16 GB y 2 TB, respectivamente.

Me parece interesante que todo el mundo le está diciendo que el almacenamiento de artículos en el disco es terriblemente terriblemente ineficient, y al mismo tiempo recomendar que utilice una base de datos, probablemente uno remoto que se va a almacenar datos en el disco en otro equipo .. ..

Se está asumiendo que el sistema sea más eficiente al manipular ciegamente el archivo de intercambio de lo que sería tener el archivo de intercambio influenciado por código que sabe lo que depara el futuro. es mucho más eficiente que cambiar la memoria que sabe que no va a ser utilizado durante un tiempo que para que el sistema se parece en nada de los elementos en la memoria y el intento de poner eficazmente algunos de los que en ese archivo.

Por supuesto, mientras equivocarse que está todo un poco a la derecha .. una base de datos local sería la forma más eficiente de almacenar datos en un archivo (donde se escribe y se lee). Si no tiene acceso a una base de datos local, entonces un código. Un HashMap está diseñado para ser almacenado en la memoria y una lista enlazada ordenada indexada está diseñado para ser almacenado en el disco. Tratando de empujar directamente desde la memoria a disco sin cierta consideración para la eficacia de ambos medios no es eficaz.

¿Qué tal esto como una opinión diferente sobre el mismo problema: Estoy creando un montón de lado del servidor de archivos PDF, tengo 10 de de 1000 de los clientes que por lo general desean ejecutar informes en el mismo momento del mes. tamaño medio de PDF podría ser 7-10Mb. Con un montón finita disponible, 'intercambiando' los datos a un archivo temporal es una forma válida para crear los archivos PDF ya que necesito para poder establecer la longitud de contenido en la respuesta antes de la transmisión de los datos PDF al cliente.

Tal vez en lugar de sólo cuestionar el diseño de algunas opciones útiles podrían ser útiles. En lo personal estoy mirando ya sea utilizando un archivo temporal por proceso o el acceso simultáneo de un único archivo 'intercambio'.

¿Qué sugieres?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top