Pregunta

Tengo un bucle que genera una gran cantidad de hilos. Estos hilos contiene, entre otras cosas, 2 (masivos) StringBuilder objetos. Estos hilos continuación, correr y hacer sus cosas.

Sin embargo, he notado que después de una cierta cantidad de hilos, consigo accidentes extraños. Sé que esto es a causa de estos StringBuilder, porque cuando reducen su capacidad inicial, puedo empezar mucho más hilos. Ahora para estos StringBuilders, se crean así en el constructor del objeto hilo:

StringBuilder a = new StringBuilder (30000);
StringBuilder b = new StringBuilder (30000);

El punto donde se bloquea generalmente es de alrededor de 550 hilos, lo que resulta en un poco más de 62 MB. En combinación con el resto del programa de la memoria en uso es más probable de 64 MB, que leí en alguna parte en línea era el tamaño de la piscina defaulf asignación de memoria de JVM. No sé si esto es verdad o no.

Ahora, ¿hay algo que estoy haciendo mal, que de alguna manera por el diseño, estoy asignación de memoria el camino equivocado? O se trata de la única manera y debe decirle a la JVM para aumentar su banco de memoria? O algo completamente distinto?

También, por favor no me diga para establecer una menor capacidad, sé que estos StringBuilders aumentan automáticamente su capacidad cuando sea necesario, pero me gustaría tener una solución a este problema.

¿Fue útil?

Otros consejos

Si va a almacenar una gran cantidad de información en un StringBuilder, se va a hacer referencia de nuevo a él en algún momento? Si no, entonces simplemente escribirlo en otro medio (DB, archivo, etc). El programa tiene una cantidad finita de los recursos, no puede contener todos el estado de un sistema completo de una vez. -Xmx le dará más espacio para su almacenamiento en la memoria, sin embargo, no hará que su capacidad de almacenamiento infinita.

Considere el uso de un ThreadPoolExecutor, y establecer el tamaño de la piscina para el número de CPU de la máquina. La creación de más hilos que las CPU es simplemente agregando encima.

ExecutorService service = Executors.newFixedThreadPool(cpuCount))

Además, se puede reducir el uso de memoria escribiendo sus cadenas de archivos en lugar de mantenerlos en memoria con StringBuilders.

Supongamos 1 MB por hilo. Ese es el costo de RAM de la creación de cada uno, más allá de la memoria asignada por su proceso.

Como dijo Gregory, dar la JVM, algunas opciones como -Xmx.

Ten en cuenta también el uso de un ThreadPool o ejecutor para asegurar que sólo una determinada cantidad de hilos se ejecutan simultáneamente. De esa manera la cantidad de memoria se puede mantener limitado sin desaceleración (como su procesador no es capaz de ejecutar 550 hilos al mismo tiempo de todos modos).

Y cuando se está utilizando un ejecutor no crean los StringBuilders en el constructor, pero en el método de ejecución.

Puede utilizar un FileWriter al texto de salida a un archivo, a continuación, tire de él con un FileReader. De esa manera lo único que necesita para almacenar el nombre del archivo en la memoria, en lugar de todo el contenido de la cadena.

Para reducir los hilos se puede usar un ExecutorService, o simplemente utilizar unos hilos que se leen de una cola.

Mi conjetura es que con un poco de bricolaje es probable que pueda obtener su programa hasta que no necesita mucha memoria en absoluto.

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