web-dev-qa-db-fra.com

High Java Utilisation de la mémoire Même pour les petits programmes

J'ai quelques applications simples écrites en Java, l'une d'elles écrite pour servir de widget. Qu'est-ce qui m'a surpris de voir combien RAM Même les petites applications utilisent.

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

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
    }
}

Puis compilé et couru avec Java ram Et cela m'a donné le suivant RAM Utilisation:

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 34 Mo. Mon système est Archlinux X86_64 et OpenJDK-7.

Y a-t-il un moyen de minimiser la quantité de RAM utilisé par la JVM?

Edit: J'ai essayé d'utiliser le drapeau -xmx et c'est ce que j'ai obtenu (1281k était le plus petit que cela me permettrait de commencer):

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

Pour la comparaison, Python2 utilise 4,4 Mo, mono utilise 4,3 Mo.

25
Vivo

Je vois des questions similaires à ce que cela a demandé fréquemment et je n'ai pas encore trouvé de réponse satisfaisante.

Les réponses que je vois le plus souvent sont fâchées "Pourquoi vous souciez-vous?" réponses. Certaines personnes mettent beaucoup de pensées et d'efforts pour faire la question et quiconque le demande semble stupide.

Certaines personnes répondront à cette question avec une longue diatribe sur les différents types de mémoire Java alloue, pourquoi cela le fait et quels paramètres de ligne de commande vous devriez examiner. (Est-ce que rarement quelqu'un est très spécifique)

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

Les raisons de l'utilisation de la mémoire apparemment anormale sont abondantes. Chaque fil obtient une certaine quantité de mémoire pour sa pile. Il existe plusieurs threads qui seront commencés, quel que soit la simplification d'un programme pour des éléments tels que le nettoyage des ordures, le RMI, etc. sous Windows/64 bits, 1 Mo par fil. Un tas de classes est chargé 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 choix de compromis que d'autres langues ne l'ont pas fait. Le temps de chargement est plus lent que la plupart des autres langues. L'exigence de mémoire initiale est plus élevée. Les cordes comme elles sont les plus couramment utilisées mangent beaucoup plus de souvenirs que la plupart des gens ne réalisent. Il y a d'innombrables autres. L'avantage pour de nombreuses situations est vraiment payé. Quelque chose comme Hello World montre le coût de ces choix plus que toute autre chose. Les avantages tels que les performances multi-threadingsas et pratiquement natives ne vous font vraiment pas de bien avec Hello World.

Malheureusement, il n'y a pas beaucoup de choses à faire pour minimiser la mémoire utilisée par une application simple. Il existe des commutateurs de ligne de commande susmentionnés et des essais et une erreur pourraient réduire votre utilisation rapportée jusqu'au niveau de 10-15 Mo, je suis sûr que, mais ces choix et les temps que vous dépensez les comprendre ne seront pas applicables à une grande variété. des applications futures. Vous devrez parcourir le même processus pour la prochaine application. Jetez une interface d'interface graphique et une certaine journalisation et une autre bibliothèque commune ou deux et votre numéro de base vous tiendra jusqu'à 60 Mo de joli Darn rapide.

Vous ne faites rien de mal. C'est juste la façon dont les choses travaillent à Java. Tu t'y habitueras. Vous choisirez une autre langue à l'occasion à cause de cela, et c'est bon aussi.

81
Steve Kallestad

Il y a plusieurs raisons à cela:

  1. Le Java Runtime est un programme plutôt complexe en soi. Il doit prendre le code octet de votre Java Program (la sortie de Javac), traduisez-la en Code de la machine pour le système Il s'exécute, il existe un optimiseur pour cela, il existe des interfaces pour le débogage, etc.
  2. Bien que votre programme soit plutôt petit, Java== chargera toujours de nombreuses classes de sa bibliothèque standard. Vous pouvez observer cela en le démarrant à l'aide de 'Java -Verbose: RAM de classe'
  3. Java alloue un grand groupe de mémoire pour votre programme à l'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 cette mémoire. Pour en savoir plus sur eux, vous pouvez utiliser l'outil JConsole, qui est inclus dans le dossier Bin de JDK. Vous pouvez en savoir plus à ce sujet à - java.sun.com . Un résumé des zones de mémoire utilisées par Java est également donné à cette question Stackoverflow
7
stmoebius