Pour la troisième solution qui consiste à passer des options à la JVM :
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=file_or_dir_path Main.java
Note : Si c'est un répertoire qui est spécifié, alors le fichier sera nommé avec le numéro du pid. Par exemple java_pid22540.hprof
.
Et pour tester ces options, cette main simple génère une OutOfMemoryError :
public static void main(String[] args) throws Exception {
int dummyArraySize = 15;
System.out.println("Max JVM memory: " + Runtime.getRuntime().maxMemory());
long memoryConsumed = 0;
try {
long[] memoryAllocated = null;
for (int loop = 0; loop < Integer.MAX_VALUE; loop++) {
memoryAllocated = new long[dummyArraySize];
memoryAllocated[0] = 0;
memoryConsumed += dummyArraySize * Long.SIZE;
System.out.println("Memory Consumed till now: " + memoryConsumed);
dummyArraySize *= dummyArraySize * 2;
Thread.sleep(500);
}
} catch (OutOfMemoryError outofMemory) {
System.out.println("Catching out of memory error");
//Log the information,so that we can generate the statistics (latter on).
throw outofMemory;
}
}
Je ne voyais pas trop l'intérêt d'une notation qui se rapproche beaucoup de la fonction printf
en C. En effet, il existe deux manières d'écrire un message avec slf4j :
#La manière classique
logger.debug("The new entry is "+entry+".");
#Et cette autre façon
logger.debug("The new entry is {}.", entry);
En fait, la deuxième façon est exactement similaire à la première, à un détail près : quand le log est désactivé, cette ligne consommera 30 fois moins de ressources que la ligne de code classique, car la chaîne de caractères n'est évaluée que si le logger est activé.
Pour info, on peut l'utiliser avec n'importe quel nombre de variables :
logger.debug("Value {} was inserted between {} and {}.", newVal, below, above);
La liste des codes postaux de France et d'Outre-Mer au format CSV.
Pour télécharger le fichier, il faut cliquer sur "Base officielle des codes postaux" (Dernière modification le mardi 28 mars 2017).
Attention: