RFR: 8038332: The trace event vm/class/load is not always being sent

David Holmes david.holmes at oracle.com
Mon Jun 13 22:40:35 UTC 2016


Hi Max,

On 14/06/2016 3:42 AM, Max Ockner wrote:
> Jiangli,
> Thanks for looking.  I didn't see anything that looked like it might
> produce duplicate events. However, I did see some additional places
> where it looks like no event is fire.
>
> Can anyone point me to the event specs?

I'm not sure there is any spec for this. Even JFR doesn't seem to 
document individual events and when they are triggered.

Your change does not look right however as you are posting the classload 
event regardless of the exception state. If you look at 
SystemDictionary::resolve_instance_class_or_null, it only posts after 
checking the load was successful:

  892   if (HAS_PENDING_EXCEPTION || k.is_null()) {
  893     return NULL;
  894   }
  895
  896   post_class_load_event(class_load_start_time, k, class_loader);

Similarly, SystemDictionary::parse_stream, has various CHECK macros that 
will cause a return on exception, prior to getting to the point of 
posting the load event. So you also need to add a check for a pending 
exception and that k is not null, I think, before posting the event.

BTW I would have expected to see trace-events generated at approximately 
the same locations as the corresponding JVMTI events. That does not seem 
to be the case which seems very strange to me. The notion of "loading a 
class" seems to be spread across far too many functions to me.

Thanks,
David

> Thanks,
> Max
>
> On 6/9/2016 4:39 PM, Jiangli Zhou wrote:
>> Hi Max,
>>
>> Looks ok. The only possible issue is more than one event might be sent
>> in some of the call paths. But my quick search didn’t find any of such
>> case.
>>
>> Thanks,
>> Jiangli
>>
>>> On Jun 9, 2016, at 11:05 AM, Max Ockner <max.ockner at oracle.com> wrote:
>>>
>>> Hello,
>>>
>>> Please review this small fix which causes the vm/class/load event to
>>> be fired from JVM_DefineClass() and JVM_DefineClassWithSource().
>>>
>>> Webrev: http://cr.openjdk.java.net/~mockner/8038332/
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8038332
>>>
>>> The vm/class/load event  (EventClassLoad) was previously fired in 2
>>> places:
>>>
>>> SystemDictionary::parse_stream
>>> SystemDictionary::resolve_instance_class_or_null
>>>
>>> parse_stream is the standard option for creating a klass from a
>>> stream, but JVM_DefineClass uses a different function:
>>>
>>> SystemDictionary::resolve_from_stream.
>>>
>>> This did not fire a vm/class/load event. Now it does fire the event.
>>>
>>> Sanity tested with jtreg runtime. Issue was reproduced and tested
>>> using the reproducer script attached to the bug
>>>
>>> Thanks,
>>> Max
>


More information about the hotspot-dev mailing list