Utilisation élevée de la mémoire Java, même pour les petits programmes

J’ai quelques applications simples écrites en java, l’une d’entre elles écrite pour agir comme un widget. Ce qui m’a surpris, c’est que même les petites applications utilisent de la RAM.

J’ai écrit ce qui suit pour voir s’il s’agit d’un bogue dans mes programmes ou d’un problème général avec Java:

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

Puis compilé et exécuté avec java ram , il me donnait l’utilisation suivante de la 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 

N’est-ce pas trop élevé? Surtout un tas de 34MB. Mon système est ArchLinux x86_64 et openjdk-7.

Existe-t-il un moyen de minimiser la quantité de RAM utilisée par la JVM?

Edit : J’ai essayé d’utiliser l’indicateur -Xmx et c’est ce que j’ai obtenu (1281k était le plus petit avec lequel je pouvais commencer):

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

A titre de comparaison, Python2 utilise 4,4 Mo, Mono utilise 4,3 Mo.

    Je vois des questions similaires à cette question fréquemment posées et je n’ai pas encore de réponse satisfaisante.

    Les réponses que je vois le plus souvent sont en colère “Pourquoi vous en souciez-vous?” réponses. Certaines personnes ont beaucoup réfléchi et fait des efforts pour poser la question et quiconque le demande semble stupide.

    Certaines personnes vont répondre à cette question avec une longue diasortingbe à propos des différents types de mémoire alloués par Java, de ses raisons et des parameters de ligne de commande à examiner. (rarement quelqu’un devient-il très spécifique)

    Le fait est que pour les petits utilitaires, Java est un outil de mémoire sur la plupart des systèmes d’exploitation. Plus l’utilitaire est petit, plus il est évident. Les développeurs Java ont longtemps été conditionnés pour traiter ou ignorer ce fait.

    Les raisons d’une utilisation apparemment anormale de la mémoire sont nombreuses. Chaque thread reçoit une certaine quantité de mémoire pour sa stack. Il y a plusieurs threads qui seront lancés quelle que soit la simplicité d’un programme pour des choses comme le nettoyage des ordures, RMI, etc. Sous Windows / 64-bit, c’est 1 Mo par thread. Un tas de classes sont chargées par défaut et toutes vos classes. Je suis sûr que beaucoup d’autres choses se passent dans les coulisses.

    Java a fait des compromis que d’autres langues n’ont pas fait. Le temps de chargement est plus lent que la plupart des autres langues. La mémoire initiale requirejse est plus élevée. Les cordes les plus utilisées consumnt beaucoup plus de mémoire que la plupart des gens ne le réalisent. Il y en a d’innombrables autres. L’avantage pour de nombreuses situations est vraiment payant. Quelque chose comme Hello World montre le coût de ces choix plus que toute autre chose. Les avantages tels que le multithread facile et les performances quasi-natives ne vous apportent rien de bon avec Hello World.

    Malheureusement, vous ne pouvez pas faire grand chose pour minimiser la mémoire utilisée par une application simple. Il y a les commutateurs de ligne de commande mentionnés ci-dessus et les essais et erreurs peuvent réduire votre utilisation rapscope au niveau ~ 10-15mb je suis sûr, mais les choix et le temps que vous dépensez ne seront pas applicables à une grande variété des applications futures. Vous devrez recommencer le même processus pour la prochaine application. Jetez dans une interface graphique et une certaine journalisation et une autre bibliothèque commune ou deux et votre numéro de base tirera jusqu’à 60mb assez vite rapide.

    Vous ne faites rien de mal. C’est juste la façon dont les choses fonctionnent en Java. Tu t’y habitueras. Vous choisirez une autre langue à l’occasion à cause de cela, et ce n’est pas grave non plus.

    Il y a plusieurs raisons à cela:

    1. Le runtime java est un programme assez complexe en soi. Il doit prendre le code octet de votre programme Java (la sortie de javac), le traduire en code machine pour le système sur lequel il s’exécute, il y a un optimiseur pour cela, il y a des interfaces pour le débogage, etc.
    2. Bien que votre programme soit plutôt petit, Java continuera à charger de nombreuses classes à partir de sa bibliothèque standard. Vous pouvez observer cela en le démarrant avec ‘java -verbose: class ram’
    3. Java alloue une grande quantité de mémoire à votre programme en avance – il ne peut pas savoir combien de mémoire il aura réellement besoin. Ceci est, entre autres, régi par l’option -Xmx. Il existe plusieurs types de mémoire de ce type. Pour en savoir plus à leur sujet, vous pouvez utiliser l’outil JConsole, qui est inclus dans le dossier bin du JDK. Vous pouvez en lire plus à ce sujet sur java.sun.com . Un résumé des zones de mémoire utilisées par Java est également donné à cette question de stackoverflow