studio reales proyectos para libro introducción incluye herramientas fuente español desarrollo código con avanzado aplicaciones java memory ram

java - reales - libro de android studio en español pdf



Alto uso de memoria Java incluso para pequeños programas. (2)

Hay varias razones para esto:

  1. El tiempo de ejecución de Java es un programa bastante complejo en sí mismo. Necesita tomar el código de bytes de su programa Java (el resultado de javac), traducirlo a código de máquina para el sistema en el que se está ejecutando, hay un optimizador para eso, hay interfaces para la depuración, etc.
  2. Aunque su programa es bastante pequeño, Java todavía cargará muchas clases desde su biblioteca estándar. Puedes observar esto iniciándolo usando ''java -verbose: class ram''
  3. Java asigna de antemano una gran cantidad de memoria para su programa; no puede saber cuánta memoria realmente necesitará. Esto se rige, entre otros, por la opción -Xmx. Hay varios tipos de tal memoria. Para obtener más información sobre ellos, puede utilizar la herramienta JConsole, que se incluye en la carpeta bin del JDK. Puedes leer más sobre esto en java.sun.com . También se proporciona un resumen de las áreas de memoria utilizadas por Java en esta pregunta de stackoverflow

Tengo un par de aplicaciones simples escritas en java, una de ellas escrita para actuar como un widget. Lo que me sorprendió de cuánta RAM usa incluso las aplicaciones pequeñas.

Escribí lo siguiente para ver si es un error en mis programas, o un problema general de Java:

public class ram { public static void main(String[] args){ while(true)System.out.print("Hello World");//while loop to give me time to check RAM usage } }

Luego lo compilé y lo ejecuté con java ram y me dio el siguiente uso de RAM:

The process java (with pid 4489) is using approximately 43.3 MB of memory. 34460 KB [heap] 7088 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/server/libjvm.so 1712 KB /usr/lib/jvm/java-7-openjdk/jre/lib/rt.jar 136 KB [stack:4495] 120 KB /usr/lib/jvm/java-7-openjdk/jre/lib/amd64/libjava.so

¿No es esto demasiado alto? Especialmente un montón de 34MB. Mi sistema es ArchLinux x86_64 y openjdk-7.

¿Hay alguna forma de minimizar la cantidad de RAM utilizada por la JVM?

Edit : intenté usar el indicador -Xmx y esto es lo que obtuve (1281k fue el más pequeño con el que me dejaría comenzar):

java -Xmx1281k ram The process java (with pid 4987) is using approximately 27.6 MB of memory. 18388 KB [heap]

Para comparación, Python2 usa 4.4MB, Mono usa 4.3MB.


Veo preguntas similares a las que me hacen con frecuencia y todavía tengo que ver una respuesta satisfactoria.

Las respuestas que veo con más frecuencia están enojadas "¿por qué te importa?" respuestas Algunas personas ponen mucho pensamiento y esfuerzo en hacer la pregunta y quien la pregunta parece estúpido.

Algunas personas responderán a esta pregunta con una larga diatriba sobre los diferentes tipos de memoria que asigna Java, por qué lo hace y qué parámetros de línea de comandos debe analizar. (rara vez alguien es muy específico)

El hecho es que para pequeñas utilidades, Java es un problema de memoria en la mayoría de los sistemas operativos. Cuanto más pequeña es la utilidad, más obvio es realmente. Los desarrolladores de Java siempre han estado condicionados a lidiar o ignorar este hecho.

Las razones para el uso de memoria aparentemente anormal son abundantes. Cada hilo recibe una cierta cantidad de memoria para su pila. Hay varios subprocesos que se iniciarán independientemente de lo simple que sea un programa para cosas como la limpieza de basura, RMI, etc. En Windows / 64 bits, eso es 1 MB por subproceso. Un montón de clases se cargan por defecto y todas tus clases. Estoy seguro de que muchas otras cosas están sucediendo detrás de las escenas.

Java ha hecho elecciones de compensación que otros lenguajes no han hecho. El tiempo de carga es más lento que la mayoría de los otros idiomas. El requisito de memoria inicial es mayor. Las cuerdas como se usan más comúnmente consumen mucha más memoria de lo que la mayoría de la gente cree. Hay muchos otros. El beneficio para muchas situaciones realmente vale la pena. Algo como Hello World muestra el costo de esas opciones más que cualquier otra cosa. Beneficios como el multihilo fácil y el rendimiento casi nativo realmente no le hacen ningún bien con Hello World.

Desafortunadamente, no hay mucho que pueda hacer para minimizar realmente la memoria utilizada por una aplicación simple. Existen los interruptores de línea de comando mencionados anteriormente y el método de prueba y error podría reducir su uso informado a un nivel de ~ 10-15 mb, estoy seguro, pero esas elecciones y el tiempo que dedique a descubrirlos no se aplicarán a una amplia variedad de futuras aplicaciones. Tendrá que pasar por el mismo proceso nuevamente para la próxima aplicación. Incorpore una interfaz GUI y algunos registros y otra o dos bibliotecas comunes y su número de base disparará hasta 60 mb bastante rápido.

No estás haciendo nada malo. Es así como funcionan las cosas en Java. Te acostumbrarás. Elegirás otro idioma en alguna ocasión por eso, y eso también está bien.