J'ai hérité d'une applet Java (<APPLET>) qui déclenche une exception OutOfMemory après environ 4 jours d'exécution. La nature de l'applet est telle que les gens la laisseront ouverte pendant de longues périodes de temps.constantPoolClass dans Java tas?
Après presque deux jours de course, jmap -histo montre les plus grands consommateurs de tas comme:
num #instances #bytes class name --- ---------- ------ ---------- 1: 14277 7321880 <constantPoolKlass> 2: 59626 5699968 <constMethodKlass> 3: 14047 5479424 <constantPoolCacheKlass> 4: 14277 5229744 <instanceKlassKlass> 5: 59626 4778944 <methodKlass> 6: 71026 3147624 <symbolKlass>
Le problème est, je ne comprends pas ce que l'une de ces choses. Il y a au moins deux choses qui se passent: constantPoolKlass + constantPoolCacheKlass + instanceKlassKlass apparaissent liés, tout comme constMethodKlass + methodKlass. À partir des noms, ils apparaissent liés à un chargeur de classe.
Si je devais deviner je dirais que l'applet a créé environ 14 277 objets où chaque objet a environ 4 méthodes, pour environ 59626 méthodes au total. Pourtant, la sortie de jmap ne montre aucune classe avec un si grand nombre d'instances, ni ne ressemble à la somme totale des autres objets de classe ajouter jusqu'à 14277. Donc peut-être que je suis incorrect sur ce que font ces objets. Quelqu'un peut-il expliquer?