Review Request (S) 8025841: JVMTI: "vtable stub" dynamic code notification is misplaced
Dean Long
dean.long at oracle.com
Fri Feb 7 16:08:36 PST 2014
OK. Your further improvement idea sounds promising.
dl
On 2/7/2014 3:55 PM, Oleg Mazurov wrote:
> The cost might be minimal but that would be a move in the wrong
> direction in my opinion.
> A larger problem is that BufferBlobs being just placeholders for
> dynamic code should not be
> reported via JVMTI at all: when they are created they usually contain
> no executable code and
> actual objects placed into such blobs are reported separately (that
> wasn't true for vtable/itable
> stubs before this fix). That the same address, that of a BufferBlob
> and its first object, could be
> reported twice is revealed by a comment to a loop that follows the
> problematic comparison:
>
> src/share/vm/prims/jvmtiCodeBlobEvents.cpp:
>
> 124 // exclude VtableStubs, which are processed separately
> 125 if (cb->is_buffer_blob() && strcmp(cb->name(), "vtable chunks")
> == 0) {
> 126 return;
> 127 }
> 128
> 129 // check if this starting address has been seen already - the
> 130 // assumption is that stubs are inserted into the list before the
> 131 // enclosing BufferBlobs.
> 132 address addr = cb->code_begin();
> 133 for (int i=0; i<_global_code_blobs->length(); i++) {
> 134 JvmtiCodeBlobDesc* scb = _global_code_blobs->at(i);
> 135 if (addr == scb->code_begin()) {
> 136 return;
> 137 }
> 138 }
>
> I believe that now that the vtable stub problem is fixed the need for
> that check is gone
> and both the strcmp() call and the following loop could be removed
> altogether, thus stopping
> further processing for *any* BufferBlob and avoiding a O(n^2) overhead
> they were causing.
> The scope of that change is much larger than the original problem
> entailed and would require
> not just additional ad hoc testing on the JMTI consumer side but also
> thorough statical analysis
> for all BufferBlob uses in the VM code.
> In fact, I was going to file a linked JIRA issue on that further
> improvement and if my idea for
> it holds true there would be no need for a new BufferBlob subtype.
>
> -- Oleg
>
> On 2/7/2014 1:06 PM, Dean Long wrote:
>> What's the cost for adding a new BufferBlob subtype? We already have
>> AdapterBlob and MethodHandlesAdapterBlob.
>>
>> dl
>>
>> On 2/6/2014 3:52 PM, Oleg Mazurov wrote:
>>> My understanding was that a buffer blob was just that - a buffer.
>>> Could potentially contain code fragments of different kinds.
>>> Thus, is_buffer_blob() was the closest type available. Agree that a
>>> dependency on its name is not reliable, though testing
>>> will reveal if the condition turns false for "vtable chunks" due to
>>> a name change (I had to deal with that particular test, Serguei
>>> should be able to identify it). Adding a comment to where the name
>>> is defined (vtableStubs.cpp) that such a dependency exists
>>> is a good idea.
>>> Thanks,
>>>
>>> -- Oleg
>>>
>>> On Feb 6, 2014, at 3:32 PM, Coleen Phillimore wrote:
>>>
>>>> Hi, I clicked on this a couple times. It seems okay but isn't there
>>>> a safer way to identify code blobs that are vtable stubs, without
>>>> looking at the name (which can change in while creating it). A
>>>> comment at least when you create "vtable chunks" would be good.
>>>> It seems that someone might want to rename it "vtable or itable
>>>> buffers", or something like that.
>>>>
>>>> thanks,
>>>> Coleen
>>>>
>>>> On 2/6/14 6:17 PM, serguei.spitsyn at oracle.com wrote:
>>>>> Runtime team,
>>>>>
>>>>> This fix was reviewed by Vladimir K. and me.
>>>>> Just wanted to make sure if you would like to review it as well.
>>>>> If not, then I will push it.
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>> On 2/3/14 2:17 PM, serguei.spitsyn at oracle.com wrote:
>>>>>> Please, review the fix for:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8025841
>>>>>>
>>>>>>
>>>>>> Open webrev:
>>>>>> http://cr.openjdk.java.net/~sspitsyn/webrevs/2014/hotspot/omazurov/8025841-JVMTI-vtbl.1
>>>>>>
>>>>>>
>>>>>> Summary:
>>>>>>
>>>>>> The fix contributed by Oleg Mazurov to improve profiling data
>>>>>> quality.
>>>>>> It moves the "vtable stub" dynamic code notification to the
>>>>>> right place.
>>>>>> I've already reviewed the fix, and it looks good to me.
>>>>>>
>>>>>> Bug report description:
>>>>>>
>>>>>> "JVMTI_EVENT_DYNAMIC_CODE_GENERATED for "vtable stub" gets
>>>>>> scheduled when
>>>>>> a new chunk of memory for subsequent vtable and itable stubs
>>>>>> is allocated.
>>>>>> That chunk is uninitialized (contains zeros or garbage)
>>>>>> although due to the fact
>>>>>> that the actual event delivery is deferred, at least one
>>>>>> vtable comes out right.
>>>>>>
>>>>>> This event should describe an individual vtable/itable stub
>>>>>> (base address and size)
>>>>>> and only after it's been created (memory is actually
>>>>>> populated with code).
>>>>>> Where VM diagnostic messages about vtable/itable stubs are
>>>>>> issued upon
>>>>>> -XX:+PrintAdapterHandlers appears exactly the right place
>>>>>> for JVMTI events as well.
>>>>>>
>>>>>> Getting vtables/itables right is important in the context of
>>>>>> performance analysis as
>>>>>> that dynamically generated code may accumulate quite
>>>>>> noticeable CPU time
>>>>>> (especially itabes), sometimes larger than the actual Java
>>>>>> methods called."
>>>>>>
>>>>>>
>>>>>> Testing:
>>>>>> Oleg tested it in the Oracle Studio Performance Analyzer
>>>>>> environment.
>>>>>> nsk.jvmti, nsk.jdi, nsk.jdwp,
>>>>>> In progress: Jtreg com/sun/jdi, java/lang/instrument
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Serguei
>>>>>>
>>
>
More information about the hotspot-dev
mailing list