Java/fr: Difference between revisions

From Alliance Doc
Jump to navigation Jump to search
(Created page with "===Mémoire === Java utilise un mécanisme de désallocation automatique de la mémoire (''garbage collector'') pour identifier les variables qui ne s'appliquent pas et retou...")
(Created page with "Vous pouvez utiliser la variable d'environnement <tt>_JAVA_OPTIONS</tt> pour configurer les options d'exécution plutôt que de les spécifier en ligne de commande. Ceci s'av...")
Line 39: Line 39:
Dans cet exemple, le maximum est de 8192Mo (8Go). Indiquez la taille initiale du tas avec l'argument <tt>Xms</tt> et voyez toutes les options en ligne de commande que la JVM exécutera avec l'indicateur <tt>-XX:+PrintCommandLineFlags</tt>.
Dans cet exemple, le maximum est de 8192Mo (8Go). Indiquez la taille initiale du tas avec l'argument <tt>Xms</tt> et voyez toutes les options en ligne de commande que la JVM exécutera avec l'indicateur <tt>-XX:+PrintCommandLineFlags</tt>.


Alternatively, you can use the <tt>_JAVA_OPTIONS</tt> environment variable to set the run-time options rather that passing them on the command line. This is especially convenient if you launch multiple Java calls, or call a Java program from another Java program. Here is an example how to do it:  
Vous pouvez utiliser la variable d'environnement <tt>_JAVA_OPTIONS</tt> pour configurer les options d'exécution plutôt que de les spécifier en ligne de commande. Ceci s'avère utile quand des appels multiples sont lancés ou qu'un programme est appelé par un autre programme Java. Voici un exemple :  
{{Command|export _JAVA_OPTIONS{{=}}"-Xms256m -Xmx2g"}}
{{Commande|export _JAVA_OPTIONS{{=}}"-Xms256m -Xmx2g"}}
When your Java program is run, it will produce a diagnostic message like this one "Picked up _JAVA_OPTIONS", verifying that the options have been picked up.
 
 
À l'exécution, le programme émet un message de diagnostic semblable à ''Picked up _JAVA_OPTIONS''; ceci indique que les options ont été prises en compte.


Please remember that the Java virtual machine itself creates a memory usage overhead. We recommend specifying the memory limit for your job as 1-2GB more than your setting on the Java command line option -Xmx.
Please remember that the Java virtual machine itself creates a memory usage overhead. We recommend specifying the memory limit for your job as 1-2GB more than your setting on the Java command line option -Xmx.

Revision as of 16:56, 25 April 2017

Other languages:

Java est un langage de programmation de haut niveau orienté objet créé en 1995 par Sun Microsystems (rachetée en 2009 par Oracle). L'objectif central de Java est que les logiciels écrits dans ce langage obéissent au principe write once, run anywhere et sont très facilement portables sur plusieurs systèmes d’exploitation par le fait que le code source Java se compile en code octal (bytecode) pouvant être exécuté sur un environnement Java (JVM pourJava virtual machine); différentes architectures et plateformes peuvent donc constituer un environnement uniforme. Cette caractéristique fait de Java un langage populaire dans certains contextes et notamment pour l'apprentissage de la programmation. Même si l'accent n'est pas sur la performance, il existe des moyens d'augmenter la vitesse d'exécution et le langage a connu une certaine popularité auprès des scientifiques dans des domaines comme les sciences de la vie, d'où sont issus par exemple les outils d'analyse génomique GATK du Broad Institute. Le but de cette page n'est pas d'enseigner le langage Java, mais de fournir des conseils et suggestions pour son utilisation dans l'environnement CHP de Calcul Canada.

Calcul Canada met à la disposition des utilisateurs plusieurs environnements Java via la commande module. En principe, vous aurez un seul module Java chargé à la fois. Les principales commandes associées aux modules Java sont :

  • java pour lancer en environnement Java;
  • javac pour appeler le compilateur Java qui convertit un fichier source Java en bytecode.

Les logiciels Java sont fréquemment distribués sous forme de fichiers JAR portant le suffixe jar. Pour utiliser un logiciel Java, utilisez la commande

Question.png
[nom@serveur ~]$ java -jar file.jar

Parallélisme

Fils d'exécution

Java permet la programmation avec fils, éliminant ainsi le recours à des interfaces et librairies comme OpenMP, pthreads et Boost qui sont nécessaires avec d'autres langages. L'objet Java principal pour traiter la concurrence est la classe Thread; on peut l'employer en fournissant une méthode Runnable à la classe Thread standard ou encore en définissant la classe Thread comme sous-classe, comme démontré ici :

Fichier : thread.java

public class HelloWorld extends Thread {
        public void run() {
            System.out.println("Hello World!");
        }
        public static void main(String args[]) {
            (new HelloWorld()).start();
        }
}


Cette approche est généralement la plus simple, mais présente cependant le désavantage de ne pas permettre l'héritage multiple; la classe qui implémente l'exécution concurrente ne peut donc pas avoir en sous-classe une autre classe potentiellement plus utile.

MPI

On utilise souvent la librairie MPJ Express pour obtenir un parallélisme de type MPI.

Pièges

Mémoire

Java utilise un mécanisme de désallocation automatique de la mémoire (garbage collector) pour identifier les variables qui ne s'appliquent pas et retourner la mémoire qui leur est associée au système d'exploitation; plusieurs programmes Java nécessitent tout de même beaucoup de mémoire pour bien fonctionner. Au lancement avec la commande java, la taille du tas Java (heap size) est initialement fixée à 1/64e avec un maximum de 1/4 de la mémoire physique. Ces proportions, et particulièrement la valeur maximale, peuvent s'avérer inadéquates et font en sorte qu'une part importante de la mémoire reste inutilisée. Pour éviter cette situation, spécifiez la quantité maximale de mémoire à utiliser avec la commande

Question.png
[nom@serveur ~]$ java -Xmx8192m -jar file.jar

Dans cet exemple, le maximum est de 8192Mo (8Go). Indiquez la taille initiale du tas avec l'argument Xms et voyez toutes les options en ligne de commande que la JVM exécutera avec l'indicateur -XX:+PrintCommandLineFlags.

Vous pouvez utiliser la variable d'environnement _JAVA_OPTIONS pour configurer les options d'exécution plutôt que de les spécifier en ligne de commande. Ceci s'avère utile quand des appels multiples sont lancés ou qu'un programme est appelé par un autre programme Java. Voici un exemple :

Question.png
[nom@serveur ~]$ export _JAVA_OPTIONS="-Xms256m -Xmx2g"


À l'exécution, le programme émet un message de diagnostic semblable à Picked up _JAVA_OPTIONS; ceci indique que les options ont été prises en compte.

Please remember that the Java virtual machine itself creates a memory usage overhead. We recommend specifying the memory limit for your job as 1-2GB more than your setting on the Java command line option -Xmx.

Garbage Collection

By default, the Java VM uses a parallel garbage collector (GC) and sets a number of GC threads equal to the number of CPU cores on a given node, whether a Java job is threaded or not. Each GC thread consumes memory. Moreover, the amount of memory each GC thread consumes is proportional to the amount of physical memory. Therefore, we highly recommend matching the number of GC threads to the number of CPU cores you requested from the scheduler in your job submission script, like so -XX:ParallelGCThreads=12 for example. You can also use the serial garbage collector by specifying the following option -XX:+UseSerialGC, whether your job is parallel or not.

The volatile Keyword

This keyword has a sense very different from that which C/C++ programmers are accustomed to. In Java volatile when applied to a variable has the effect of ensuring that its value is always read from and written to main memory, which can help to ensure that modifications of this variable are made visible to other threads. That said, there are contexts in which the use of the volatile keyword are not sufficient to avoid race conditions and the synchronized keyword is required to ensure program consistency.

Further Reading

Scott Oaks and Henry Wong, Java Threads: Understanding and Mastering Concurrent Programming (3rd edition) (O'Reilly, 2012)