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:
références entrantes pour tableau de caractères holded à T4CConnection charBufferCache:
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
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
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