Trace object allocation flag proposal

Tom Rodriguez tom.rodriguez at oracle.com
Wed Dec 15 12:37:54 PST 2010


On Dec 15, 2010, at 11:21 AM, Y. S. Ramakrishna wrote:

> 
> 
> On 12/15/10 10:24, Xiaobin Lu wrote:
>> One of the problems JVMTI has is that once it is enabled, it will fire all kinds of events which will cause even more overheads. Correct me if I am wrong here.
> 
> I didn't think JVMTI is "all or nothing" (if i understood yr statement).
> But i will let the serviceability/JVMTI cognoscenti comment.

We recently fixed a bug that created unneeded overhead in compiled code when running with JVMTI agents.  Previously just the existence of a JVMTI agent turned on some options in the compilers that kept extra locals alive but the fix for 6943485 fixed that.  I think the only compiled overhead you should see these days are when you turn on things like can_post_on_exceptions and can_access_locals.

tom

> 
>> DTrace provides obj-alloc probes which is exactly what many people like to have on Linux. And that is exactly what I am proposing here.
> 
> Ah, i see. (Sorry for not reading through yr proposal before talking.)
> But orthogonally to yr proposal, which is narrowly targeted to addressing
> this specific issue related to object allocation,
> why not use Linux system tap or other to mimic as much as possible the
> Dtrace probes provided by the JVM, rather than making this point fix (if
> i understand yr proposal) for just one aspect of what's offered by
> Dtrace?
> 
> Over to the serviceability folk; and out.
> -- ramki
> 
>> Thanks,
>> -Xiaobin
>> On Wed, Dec 15, 2010 at 10:06 AM, Y. S. Ramakrishna <y.s.ramakrishna at oracle.com <mailto:y.s.ramakrishna at oracle.com>> wrote:
>>    Doesn't JVMTI already provide hooks (BCI?) for tracing allocation?
>>    Perhaps that's found to be too obtrusive? Don't Java IDE's
>>    use JVMTI to already deliver this kind of info to developers?
>>    Pardon my naivette re JVMTI capabilities in this regard.
>>    -- ramki
>>    (java-serviceability-tools-illiterate)
>>    On 12/15/10 10:00, Xiaobin Lu wrote:
>>        Thanks for your feedback, David.
>>        Let me try to clarify with some more background information.
>>        One of the problems many application has is the object
>>        allocation problem (Duh ...). Over releases, GC becomes more and
>>        more frequent. It is pretty hard for one single team to find out
>>        where the problem goes wrong. The existing tool such as jhat or
>>        jmap is very hard to work with giant heap dump file. So the flag
>>        I propose is mostly for diagnostic purpose, it won't be enabled
>>        by default in production. Having said so, if we make it as a
>>        manageable flag, we can turn it on when GC goes wild.
>>        Another value this flag could provide is to find out why
>>        sometime OOM occurs. For example, someone who wrote a search
>>        application on top of Lucene framework suddenly found a crash
>>        due to OOM. The stack trace points to Lucene code which is hard
>>        to instrument, so this flag could provide insight to why the
>>        allocation fails. Maybe it is due to a corrupted length value
>>        passed to "new byte[length];" etc.
>>        I like your idea on per-thread basis, however, for a lot of web
>>        application, thread comes and go. It is pretty hard to pin point
>>        on which thread I want to trace the object allocation.
>>        To answer your last question, what I am really interested in
>>        finding out is what type of object allocation makes GC happens
>>        more frequent. Randomly taking snapshot of heap using jmap is
>>        absolutely not an idea way to do so since not only it generates
>>        a giant file which is difficult to work with, also it will pause
>>        the application and cause negative impact to the application
>>        throughput. After I get the type of hot allocation, if it
>>        happens to be an application level object type such as
>>        com.Xyz.search.IndexReader, I can instrument the constructor to
>>        dump the caller stack. People here also suggests it would be
>>        nice if we could dump the allocation stack trace for some
>>        particular hot types.
>>        I could propose the diff for your folks to review.
>>        Thanks,
>>        -Xiaobin
>>        On Tue, Dec 14, 2010 at 11:58 PM, David Holmes
>>        <David.Holmes at oracle.com <mailto:David.Holmes at oracle.com>
>>        <mailto:David.Holmes at oracle.com
>>        <mailto:David.Holmes at oracle.com>>> wrote:
>>           Hi Xiaobin,
>>           The problem with tracing like this is that to be useful the
>>        tracing
>>           must be unobtrusive and be able to handle getting called
>>        millions of
>>           times (which is what will happen in those GC scenarios you
>>           describe). The sheer volume of data generated as you suggest
>>        below
>>           would overwhelm the app and be pretty hard to work with.
>>           Per-thread statistics of particular types (or of objects
>>        larger than
>>           a certain size) might be more useful, with a dump able to be
>>           requested on-demand.
>>           But I think you'd need to be able to combine this with heap dump
>>           info to be useful.
>>           It really depends on exactly what info you want to be able to
>>           deduce: simple number of objects of given types, hot allocation
>>           sites, hot threads, ...
>>           Cheers,
>>           David
>>           Xiaobin Lu said the following on 12/15/10 17:07:
>>               Hi folks,
>>               I would like to propose a way to trace object allocation on
>>               Linux. On Solaris, we have DTrace which is pretty nice.
>>        But on
>>               Linux, it is almost impossible to do so. Correct me if I am
>>               wrong here.
>>               So I am thinking to add a manageable VM flag and let's
>>        call it
>>               TraceObjectAllocation. When enabled, we can output
>>        something like:
>>               thread id: 10     class name: java/lang/reflect/Method                           size: 80 bytes
>>               thread id: 10     class name: [Ljava/lang/Class;                                  size: 16 bytes
>>               thread id: 10     class name: [C                                                                         size: 56 bytes
>>               thread id: 10     class name: java/lang/reflect/Method                          size: 80 bytes
>>               thread id: 10     class name: [Ljava/lang/Class;                                 size: 16 bytes
>>               As you could imagine, this could be very useful to keep
>>        track of
>>               object allocation behavior in the app. Some smart tool
>>        can take
>>               advantage of this to print a histogram (like top 10 hot
>>               allocations) of object allocation. I would like to know your
>>               thoughts and suggestions on this.
>>               I have a detailed proposal on this attached in PDF file.
>>               Thanks,
>>               -Xiaobin



More information about the hotspot-runtime-dev mailing list