RFR(xs): 8213834: JVMTI ResourceExhausted should not be posted in CompilerThread

serguei.spitsyn at oracle.com serguei.spitsyn at oracle.com
Wed Nov 14 23:58:57 UTC 2018


Hi David,


On 11/14/18 15:05, David Holmes wrote:
> Hi Serguei,
>
> On 15/11/2018 5:20 am, serguei.spitsyn at oracle.com wrote:
>> Hi Thomas,
>>
>> Thank you for taking care about this issue!
>> We recently also saw a couple of problems related to the compiler 
>> thread not being hidden.
>>
>> I have several comments to the fix.
>>
>> It would be really nice if there is any chance to have a unit test 
>> for this.
>> But I understand that it is not easy to minimize what you have in 
>> your agent.
>>
>> http://cr.openjdk.java.net/~stuefe/webrevs/8213834-jvmti-reourceexhausted-shall-not-be-posted-from-compiler-thread/webrev.00/webrev/src/hotspot/share/prims/jvmtiExport.cpp.udiff.html 
>>
>>
>>   void JvmtiExport::post_resource_exhausted(jint 
>> resource_exhausted_flags, const char* description) {
>> +
>> + // Handlers may call back into the JVM as a reaction to this event, 
>> e.g. to print out
>> + // a class histogram. Most of those actions require the ability to 
>> run java though. So
>> + // lets not post this event in cases where we cannot run java (e.g. 
>> when a CompilerThread
>> + // triggers a Metaspace OOM).
>> + Thread* thread = Thread::current_or_null();
>> + if (thread == NULL || !thread->can_call_java()) {
>> + return;
>> + }
>> +
>> 1. Did you check that your fix does also work with the Graal enabled? 
>> The CompilerThread::can_call_java() should return true for JVMCI is 
>> used: bool CompilerThread::can_call_java() const { return _compiler 
>> != NULL && _compiler->is_jvmci(); } 
>
> That's exactly why I suggested checking for can_call_Java() - because 
> it would work with JVMCI/Graal.

Does it mean, we want to continue posting such events on the JVMCI/Graal 
compiler threads executing Java?


>> 2. It is better to use the is_hidden_from_external_view() instead of 
>> !can_call_java() 
>
> Why? In terms of being conservative that would be unnecessarily 
> conservative. If the problem is only executing Java code why go beyond 
> that?

   The is_hidden_from_external_view() means the same as !can_call_java() 
CompilerThread's:
   // Hide native compiler threads from external view.
   bool is_hidden_from_external_view() const      { return 
!can_call_java(); }

   It seems the ServiceThread and CodeCacheSweeperThread do not follow 
the above rule.
   But do we want to post any events on the hidden threads?

>
> BTW what exactly is the set of hidden threads these days?

 From my observation the following threads are hidden now:
   ServiceThread
   CodeCacheSweeperThread
   All native CompilerThread's that return false from can_call_java().


Thanks,
Serguei

>> 3. The 'thread' is already defined in post_resource_exhausted:
>>
>>    JavaThread *thread  = JavaThread::current();
>>   But it is in a deeper scope.
>>
>>    void JvmtiExport::post_resource_exhausted(jint 
>> resource_exhausted_flags, const char* description) {
>>      EVT_TRIG_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Trg resource 
>> exhausted event triggered" ));
>>
>>      JvmtiEnvIterator it;
>>      for (JvmtiEnv* env = it.first(); env != NULL; env = it.next(env)) {
>>        if (env->is_enabled(JVMTI_EVENT_RESOURCE_EXHAUSTED)) {
>>          EVT_TRACE(JVMTI_EVENT_RESOURCE_EXHAUSTED, ("Evt resource 
>> exhausted event sent" ));
>>
>>          JavaThread *thread  = JavaThread::current();
>>
>> I'd suggest to move it up as it is a better place for it anyway.
>> Also, you do not need the extra check:
>> if (thread == NULL || !
>
> Agreed - Thread::current() can not be NULL in this context.
>
> Cheers,
> David
>
>>
>> Thanks,
>> Serguei
>>
>>
>> On 11/14/18 07:06, Daniel D. Daugherty wrote:
>>> Adding serviceability-dev at ...
>>>
>>> Since the proposed solution to the bug is to not post an event, I think
>>> the Serviceability Team (which owns JVM/TI) needs to be involved 
>>> directly
>>> in the review.
>>>
>>> Dan
>>>
>>>
>>> On 11/14/18 9:28 AM, Thomas Stüfe wrote:
>>>> Dear all,
>>>>
>>>> may I please have reviews on this small patch. Note that this is
>>>> borderline serviceability. I try to avoid crossposting, but if you
>>>> think this should be looked at by serviceability feel free to forward
>>>> it there.
>>>>
>>>> Issue: https://bugs.openjdk.java.net/browse/JDK-8213834
>>>>
>>>> CR: 
>>>> http://cr.openjdk.java.net/~stuefe/webrevs/8213834-jvmti-reourceexhausted-shall-not-be-posted-from-compiler-thread/webrev.00/webrev/
>>>>
>>>> Short description: we may post ResourceExhausted from Compiler
>>>> threads. Handlers of this event may call back into the JVM, which may
>>>> cause problems since we run in the compiler thread. The proposed
>>>> solution is not to post the event in that case.
>>>>
>>>> See previous discussion here:
>>>> http://mail.openjdk.java.net/pipermail/serviceability-dev/2018-November/025898.html 
>>>>
>>>>
>>>> Thanks, Thomas
>>>
>>



More information about the serviceability-dev mailing list