Ce qui se passe lorsque la JVM est à court de mémoire à allouer au cours de l'exécution?

Après avoir réfléchi pendant un long moment, d'une façon générique pour poser cette question (et à défaut de trouver un), je vais juste à la poser comme un exemple concret:

Supposons que j'ai une machine Linux qui dispose de 1 Go de mémoire que l'on peut attribuer à des processus (physiques et swap totaux 1 Go).

J'ai un Oracle standard de la JVM Hotspot version 7 est installé sur la machine. Si à un moment donné, il y a suffisamment de programmes en cours d'exécution tels que seulement 400 Mo de 1 Go sont libres, et je commence un programme Java en ce moment avec la JVM ci indicateurs:

java -Xms256m -Xmx512m -jar myJar.jar

ce qui se fait? :

A. est-ce que la JVM ne pas démarrer tout de suite, car il va essayer d'attribuer toutes les 512 Mo de mémoire et un échec (en raison du fait qu'il n'y a pas assez de mémoire disponible pour le moment)?

si la JVM commence:

si à un certain moment de l'exécution de Java processus aura besoin de plus de 400 Mo de mémoire (et il y a encore seulement 400 Mo de mémoire libre, autre que ce que l'actuel processus Java, a déjà utilisé), ce qui va arriver:

B. est le processus Java échouer avec un OutOfMemroyError?

C. il va échouer avec quelques autres (standard) erreur?

D. est-il un comportement indéfini?

Je crois que l'option (B), mais si seulement 200 Mo (moins de Xms) était disponible, alors l'option A.

OriginalL'auteur Shivan Dragon | 2012-11-07