7153375 "jmap -histo" should output a unique identifier with each line

Takao, Shinji takao.shinji at oss.ntt.co.jp
Fri Mar 23 03:33:11 PDT 2012


Hi Kris,

Thank you for your suggestive comment.

I still have some unclear points, however, I understand
we have faced some difficulties to guarantee consistent 
identity to the Klasses.

Both the perm-gen story and the GC-requiring memory story are
very interesting. I also found some interesting information
in your references (Yes, I could read the blog entry :-)

I hope we will be able to keep in touch.

Thank you,
Shinji

 
> Hi Shinji,
> 
> Comments inline:
> 
> 
> On Fri, Mar 23, 2012 at 9:44 AM, Takao, Shinji 
> <takao.shinji at oss.ntt.co.jp> wrote:
> 
> 
> 	Hi Kris,
> 	
> 	Thank you for your suggestions.
> 	Yes, as you said, the hashCode() merely returns an address...
> 	
> 	54     public int hashCode() {
> 	55         // FIXME: suggestions on a better hash code?
> 	56         return (int) addr;
> 	57     }
> 	
> 	You mean, so to speak, if GCs (with compaction?) on
> 	perm gen never happen, this patch will work better,
> 	and removing perm gen will be bound to the same situation?
> 	
> 
> After the perm-gen removal work is complete, Klasses will no 
> longer be subject to GC, and I suppose they shouldn't have to 
> move during their lifetime.
> 
> Disabling class unloading gives you something similar, but 
> not quite there yet.
> 
> If you're on JDK6, HotSpot VM stores interned Strings (and 
> the associated char arrays) in the perm-gen. If perm-gen 
> fills up, it'll trigger a full GC which will collect the 
> whole GC heap (including the perm-gen), and move things 
> around. Even if you use -Xnoclassgc or -XX:-ClassUnloading, 
> it doesn't mean perm-gen is not collected; it only ensures 
> that all classes, once loaded, never gets unloaded. When you 
> have Strings and char[]'s in the perm-gen, and when some of 
> them are found to be dead in a full GC, the Klasses are bound 
> to be moved.
> 
> On JDK7+, a lot of the stuff have moved away from perm-gen 
> already. Interned Strings have moved back to normal Java 
> heap, Symbols have moved outside the GC heap. So disabling 
> class unloading gives a better chance of getting the Klasses 
> "pinned", but that's not a hard guarantee.
>  
> 
> 	If you are planning to do so, I will wait for it.
> 	
> 	
> 
> Ehehe...I don't work for Oracle and I'm not in a part of the 
> perm-gen removal project. Jon Masamitsu is the guy to talk to. [1]
>  
> 
> 	However, I wonder whether we can utilize the identity hash
> 	or not. I guess hashing the java mirror every time
> 	might cause a performance issue, but, for exapmle, a java
> 	option to switch on the function to do so seems useful,,,
> 	especially when we are in development phases of java programs.
> 	
> 	
> 
> Identity hash code for Java objects are calculated at most 
> once per object; it's either never used (which is never 
> calculated), or calculated just once and cached, either in 
> the object header (the mark word) or in a lock record. Using 
> the identity hash code is usually a low cost operation.
> The bad news is, SA can't calculate the identity hash code 
> for a Java object on its own; if an object was never asked 
> for its identity hash code during the normal run, then it 
> would have been never calculated by the VM, and then SA will 
> just return 0 for that case.
> 
> In other words, in order to able to use the identity hash 
> code of a java.lang.Class for tracking its identity in SA, 
> every Class instance has to be hash'd (by invoking its 
> hashCode() or by System.identityHashCode()), and that'll need 
> some effort. The easiest way may be using a Java agent to 
> force hash all loaded classes, and new loaded classes as 
> they're loaded.
> But that's not a clear win. Using the identity hash code has 
> other implications. One of them is that the auxiliary memory 
> that the GC needs may grow bigger if you hash a lot of 
> objects this way. Nakamura-san's blog post demonstrates this 
> behavior [2]; I'm sure you can read it :-)
> 
> I'm sorry but I haven't come up with any good way of tracking 
> a class's identity, yet. If only there's a way to track the 
> identity of a class loader...
> 
> - Kris
> 
> [1]: 
> http://mail.openjdk.java.net/pipermail/hotspot-dev/2012-March/
> 005441.html
> [2]: http://www.nminoru.jp/~nminoru/diary/2012/02.html#20120218p1
>  
> 
> 	Thank you,
> 	Shinji
> 	
> 
> 
> 	> Oops, missed the link in the last mail:
> 	> [1]:
> 	> http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a142c
> 	
> 661f6b1/agent/src/share/classes/sun/jvm/hotspot/debugger/linux
> /LinuxAddress.ja 
> <http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/file/a142
> c 
> 661f6b1/agent/src/share/classes/sun/jvm/hotspot/debugger/linux
> /LinuxAddress.ja> > va
> 	>
> 	>
> 	> On Thu, Mar 22, 2012 at 4:50 PM, Krystal Mok
> 	> <rednaxelafx at gmail.com> wrote:
> 	>
> 	>
> 	>       Hi Shinji,
> 	>
> 	>       This patch should work better after the work on
> 	> Permanent Generation removal is integrated into mainstream.
> 	> For now, though, it's not guaranteed to work: Klasses are
> 	> subject to GC, which could move around from time to time.
> 	>
> 	>       You're using hashCode() from the Klass, whichi
> 	> ultimately boils down to the value of an address in the
> 	> current implementation of SA. See [1] for example. It may
> 	> change from run to run if the object is moving.
> 	>
> 	>       It might have been better to use the identity hash code
> 	> of the Java mirror (the java.lang.Class instance) as the
> 	> "identifier". Too bad, that doesn't work with SA either; if
> 	> the Java mirror was never hash'd, SA won't be able to
> 	> calculate its identity hash code -- which is the case most of
> 	> the time.
> 	>
> 	>       - Kris
> 	>
> 	>       On Thu, Mar 22, 2012 at 3:50 PM, Takao, Shinji
> 	> <takao.shinji at oss.ntt.co.jp> wrote:
> 	>
> 	>
> 	>               Dear all,
> 	>
> 	>               As a trouble shooter of java programs, I have
> 	> been examinig
> 	>               heap object histograms for tracking down memory
> 	> leaks, and
> 	>               found an inconvenience in the histograms output
> 	> by jmap (-F) -histo.
> 	>               Please see the CR 7153375 for details.
> 	>
> 	>               And, I would like to show a quick fix for that.
> 	>               Please see the attached file (for 
> openjdk8b27 hospot).
> 	>               I am not sure if it is the most appropriate way
> 	> to fix that,
> 	>               however, I am glad if it will be a meaningful
> 	> starting point.
> 	>
> 	>               I am quite new to this ML, so I appreciate your
> 	> assistance.
> 	>
> 	>               Regards,
> 	>               Shinji
> 	>
> 	>
> 	>
> 	>
> 	>
> 	>
> 	
> 	
> 
> 
> 



More information about the serviceability-dev mailing list