2010-08-04 12 views
9

He escrito un programa Java que prueba la velocidad de un par de algoritmos multi-threading en diferentes máquinas con varios números de procesadores.dinámicamente creciente espacio en el montón de Java

En algunas máquinas, merge sort * falla porque requiere un espacio de montón considerable para trabajar en matrices muy grandes. Puedo cambiar fácilmente el espacio del montón de Java antes de ejecutar el programa, pero creo que un enfoque más sólido y fácil sería realizar esta tarea desde el propio programa.

¿Hay alguna manera de solicitar/obtener más espacio en el montón de la máquina virtual durante el transcurso de un programa Java?

Nota: Entiendo que podría ejecutar el programa con un script como "java -Xmx1g Program"; mi curiosidad sobre este tema es en parte académica.

* Mi implementación NO se combina en línea. Requiere O (n) memoria adicional.

+0

No creo que esto sea posible. – helpermethod

Respuesta

2

Java no fue diseñado para poder administrar dinámicamente la memoria, en este caso, "espacio de pila de Java", todo lo contrario, fue diseñado con el fin de evitar que el programador tenga que preocuparse por eso.

En resumen, me temo que no hay nada como un "malloc()" o "setHeapSize(int byes)" en Java.

En Java está limitado a la cantidad de memoria disponible para el JVM cuando se inicia el programa. En términos de gestión de la memoria, esto es tanto una bendición como una maldición.

Para ese tipo de asignación dinámica de memoria, intente utilizar su algoritmo usando un lenguaje como C y/o C++.

+0

Erm, Sun JVM para Windows cambia el tamaño del montón (es decir, solicita o devuelve la memoria desde/hacia el sistema operativo) dentro de los límites establecidos por -Xms y -Xmx. Puede ver esto, por ejemplo, en visualvm. – meriton

+0

Bueno, la palabra clave * new * en java es prácticamente equivalente a malloc() en c como en C++. Pero gracias; esto aclara las cosas. – Robz

+1

estás mezclando conceptos. El hecho de que alguien quiera cambiar dinámicamente el tamaño máximo de almacenamiento dinámico no tiene nada que ver con el hecho de que la máquina virtual está diseñada para liberar al programador para que haga la administración de la memoria. Yo, como administrador de sistemas, podría haber calculado mal el requisito de espacio dinámico de mi aplicación, y quiero aumentarlo sin reiniciar la aplicación. Es técnicamente factible cambiar el tamaño del espacio de almacenamiento dinámico, ya que la JVM lo hace (de mínimo a máximo). – ithkuil

6

Hasta donde yo sé, no hay forma de controlar el tamaño del montón en tiempo de ejecución.

Puede que no sea necesario: puede proporcionar un tamaño de pila mínimo y máximo de con los conmutadores -Xms y -Xmx respectivamente. (por ejemplo, -Xms128m -Xmx512m) El jvm administrará el tamaño del montón real dentro de estos límites.

2

El máximo no es el tamaño de la memoria utilizada, esto es dinámico en función del uso.

El tamaño máximo de almacenamiento dinámico debe ser el punto en el que preferiría que el programa fallara, que usar más memoria. Tiene poco sentido cambiar esto dinámicamente, incluso académicamente.

Cuestiones relacionadas