0

J'ai l'application en cours d'exécution sur HotSpot jvm 1.8.0_45 avec tas de 8 Go bien emballé. L'application essaye d'allouer de la mémoire pour de nouveaux objets échoue avec l'erreur de MOO d'espace de tas. J'ai regardé le tas dump et ai constaté que la plupart de l'espace est occupé par charBufferCaches des instances de T4CConnection. Ces caches contiennent des SoftReferences pour les tableaux char. J'ai été surpris que SoftReferences n'ait pas été publié avant OOM. J'ai vérifié deux fois s'il y a des références dures pour ces tableaux mais n'en ai pas trouvé un. Pourquoi ai-je un MOO d'espace mémoire lorsque l'application contient 3 Go de tableaux char par SoftReferences? Pourquoi ce SoftReferences pas publié lorsque l'application besoin de nouvelle mémoire?Erreur OOM et SoftReferences étranges

partie de l'objet T4CConnection montrant charBufferCache:

part of T4CConnection object showing charBufferCache

références entrantes pour tableau de caractères holded à T4CConnection charBufferCache:

incoming references for char array holded at T4CConnection charBufferCache

+0

Quand la décharge a-t-elle été capturée? il est possible que le tableau ait été maintenu actif par quelque chose sur la pile et que cela ne soit pas reflété dans la sauvegarde après que la pile ait été déroulée à cause de l'exception. également, le type spécifique de questions de MOO, par ex. un dépassement de capacité peut se produire même si la demande d'allocation a pu être satisfaite après avoir libéré des références logicielles. – the8472

+0

Le vidage a été créé avec l'option JVM + HeapDumpOnOutOfMemoryError. Je pensais que les instantanés produits par cette option devraient contenir tous les objets et références au moment de l'apparition de l'erreur OOM. Y a-t-il une chance que certaines références soient absentes dans l'instantané? En outre, mon application ne consomme pas de mémoire par grandes trames - il n'y a aucune chance qu'elle essaye d'allouer 2 Go d'objet à la fois. – nukie

+0

Oui, je pense que cette option inclut les racines de la pile. mais le type exact d'OOME peut encore faire la différence. – the8472

Répondre

1

Idéalement-références douces sont censées être effacées avant de jeter OOM. Je suspecte il y a une fuite de mémoire dans le programme ..

Vous pouvez jeter un oeil à ici - How to cause soft references to be cleared in Java?

essayer -XX:SoftRefLRUPolicyMSPerMB=<value> paramètre pour limiter la taille des références douces et vérifier si elle aide. Cela peut fournir une direction à l'étape suivante.

+0

Merci, @Anand Vaidya! Je vais essayer cette option. – nukie

-1

Un SoftReference ou un WeakReference ne seront effacés que si l'objet est nettoyé. Cela n'empêchera pas la collecte d'un objet, mais si cet objet a une référence forte quelque part, il sera conservé après un GC.

par exemple.

Double d = new Double(123456); 
WeakReference<Double> ref = new WeakReference<>(d); 
System.gc(); 
System.out.println(ref.get() + " == " + d); // both not null. 
+0

merci, @ Peter Lawrey! Je comprends, que la magie faible/douce ne fonctionnera pas si l'application contient de fortes références. J'ai recherché des références entrantes pour chaque objet référent SoftReferenece suspect à mon vidage de tas. Je n'ai trouvé aucune référence pour les tableaux de caractères à côté des conteneurs de référence ... C'est le point principal de mon problème: j'ai des références souples pour les objets et pas de références fortes pour ces tableaux ... – nukie