2010-08-18 17 views
17

Siempre me he preguntado por qué Java requiere que configure el tamaño del montón de forma manual. Tenía la impresión de que los programas escritos en otros idiomas asignarían tanta memoria como fuera necesario a medida que el programa se ejecutara hasta que el SO no pudiera asignar más.¿Por qué necesita especificar el tamaño de pila de Java?

En el mundo de Java, necesitamos establecer el montón, la pila y el tamaño de permgen. Si bien esto es lo suficientemente simple, olvidar aumentar estos números a "lo suficientemente grandes" es la razón número 1 por la que he visto bajar los servidores.

¿Por qué no es posible decirle a Java que crezca el montón/pila/permgen tanto como necesita con el tiempo?

Respuesta

4

Mi interpretación es que Sun es una compañía enfocada en vender Big Boxes y les gusta que los administradores de sistemas puedan hacer cosas en estas cajas. Ejecutar un sistema para llenar toda la memoria es una buena manera de ejecutarlo en el suelo y no poder actuar de manera eficiente para restaurar la operación porque no puede asignar memoria para crear un shell de inicio de sesión, por ejemplo.

4

Creo que porque la memoria real de la computadora es finita. Entonces, en cierto sentido, JVM le permite detectar memleks antes de que se desperdicie toda la memoria.
Además, ¿qué hacer si ejecuta varias JVM en la misma máquina? En este caso, ¿cómo permite que cada una de estas JVM crezca "tanto como lo necesite"?

1

Porque aumentar el montón, la pila y el tamaño de permgen dinámicamente simplemente haría que el servidor caiga de todos modos. En un mundo así, el servidor eventualmente perdería todos sus recursos.

Además, el desarrollo de la administración automática de la memoria no era tan maduro como lo es hoy en día. Tener límites virtuales facilita las cosas si elige los valores predeterminados incorrectos, pero puede hacer que la codificación sea un poco menos eficiente en el back-end.

Sí, estas son suposiciones, pero razonables; especialmente cuando se consideran los orígenes de Java/Oak de la programación del decodificador integrado. No es que un sistema integrado tenga memoria virtual swap o respaldada en disco, entonces, ¿por qué hacer que la JVM actúe como si estuviera disponible?

7

tres razones:

  1. Debido a que Java fue pensado para ser un lenguaje para escribir aplicaciones web. Por lo general, no se considera una buena idea permitir que una aplicación web se haga cargo de todos los recursos de la máquina.
  2. Porque Java es basura recolectada. Además de especificar un límite superior de memoria, el tamaño de almacenamiento dinámico también desencadena la recolección de basura. Básicamente, estás diciendo "puedes usar tanto, pero cuando llegas a ese límite tienes que ordenar".
  3. Hay muchas clases de aplicaciones en las que desea limitar la cantidad de memoria utilizada por el proceso de Java, p. Ej. donde es más importante que otros procesos continúen cuando no haya memoria suficiente para ambos.
  4. Porque siendo capaz de limitar el tamaño del montón es una característica. Si le gusta el enfoque donde el proceso puede tener memoria ilimitada (como en los otros idiomas mencionados), entonces siempre puede establecer que el límite del montón sea más de lo que podría adquirir. Si desea limitar el tamaño del almacenamiento dinámico, puede hacerlo. Otros idiomas tienen solo uno de esos comportamientos posibles, haciéndolos menos flexibles.
+2

¿Tiene una fuente para el primer punto? Nunca antes había escuchado la frase "java fue para escribir aplicaciones web" (no es que haya profundizado en la historia de Java, tampoco ...) – Mike

+2

Mala moderación.Java desciende de Oak, que se suponía que implementaría un software de decodificadores, como el que podría haber tenido en sintonizadores sofisticados de TV por cable. Y en lo que respecta a la recolección de basura, la basura se recoge cuando el objeto es inaccesible, no cuando se alcanzan los límites de la memoria. –

+0

@Edwin Buck: 'la basura se recoge cuando los objetos son inaccesibles, no cuando se alcanzan los límites de la memoria' Cierto, pero no son" inmediatamente "GCd. La rapidez con que DEBE depender depende del tamaño del montón y puede ser extremadamente importante para el rendimiento. –

Cuestiones relacionadas