2009-08-14 5 views
4

Comment se fait-il que chaque objet semble marqué comme nouveau, au lieu de simplement les objets qui sont dans le deuxième instantané mais pas dans mon instantané de base? En regardant autour de moi en ligne, je vois quelques suggestions que j'ai besoin d'utiliser hprof au lieu de jmap pour faire mes vidages mémoire, mais il semble que hprof génère des dumps exactement au même format.Pourquoi l'option -baseline de jhat ne fonctionne-t-elle pas?

Ceci est JDK 1.6.0_14; J'ai essayé sur Windows et UNIX.

+0

Pouvez-vous détailler la version de la plate-forme (Windows? Unix?) Et le jdk? – VonC

Répondre

10

jhat -baseline en effet ne fonctionnera pas avec les décharges produites par jmap. Je ne suis pas certain, mais je crois c'est parce que hprof attache à la JVM dès le départ et conserve sa propre piste d'objets, ce qui lui permet de produire des ID cohérentes sur plusieurs décharges. Ne me citez pas là-dessus. D'une manière ou d'une autre, le point important en ce qui vous concerne est que les vidages de jmap ne fonctionnent pas.

Cependant, tout n'est pas perdu. Va chercher le Eclipse Memory Analyzer. (. Si vous ne l'utilisez Eclipse, ne craignez pas, vous pouvez l'obtenir comme un exécutable autonome) Il est plus rapide que jhat, utilise moins de mémoire que jhat et il peut faire ce que vous voulez:

  1. dump2 Ouvert (avec File | Open Heap Dump). Ne vous embêtez pas à le faire créer un rapport pour vous.
  2. Ouverture dump1 (même manière). Encore une fois, pas de rapport.
  3. Dans l'onglet pour dump2, cliquez sur "Histogramme"
  4. Sur la droite de la barre d'outils dans le sous-onglet Histogramme est "Comparer à un autre tas". Cliquez dessus.
  5. Sélectionnez dump1 dans votre boîte de dialogue en tant que vidage à utiliser comme ligne de base.
  6. Presto, vous avez les différences entre dump2 et le dump1 de base.

Tout cela fonctionne très bien avec un vidage jmap.

+0

Génial! Y a-t-il un moyen, à partir de là, d'explorer des objets spécifiques qui sont nouveaux dans le dump 2 et de découvrir ce qui les retient? – skiphoppy

+0

Pour autant que je sache, pas directement de la comparaison, non. Vous pouvez forer de l'ensemble, cependant. (Sélectionnez Dominator Tree, filtrez vers la classe qui vous intéresse, cliquez avec le bouton droit de la souris, sélectionnez Lister les objets avec les références entrantes, développez l'arborescence comme vous le souhaitez.) Je reconnais qu'être capable de voir ce qui se utile, mais je ne sais pas comment le faire. –

0

Il semble que vous deviez utiliser hprof. Mais êtes-vous sûr d'utiliser la même instance de machine virtuelle? L'option -baseline permet de comparer deux dumps s'ils ont été produits par HPROF et à partir de la même instance de machine virtuelle. Si le même objet apparaît dans les deux vidages, il sera exclu de la liste des nouveaux objets signalés. Un cliché est spécifié en tant que ligne de base et l'analyse peut se concentrer sur les objets créés dans la seconde image depuis l'obtention de la ligne de base. Si tout est considéré comme nouveau, je m'assurerai que c'est la même instance de la machine virtuelle.

Here