RFR (M): 8207266: ThreadMXBean::getThreadAllocatedBytes() can be quicker for self thread

David Holmes david.holmes at oracle.com
Fri Sep 13 22:34:38 UTC 2019


Hi Paul,

On 14/09/2019 5:11 am, Hohensee, Paul wrote:
> Hi David, thanks for your comments. New webrev in
> 
> http://cr.openjdk.java.net/~phh/8207266/webrev.08/
> 
> Both the old and new versions of the code check that thread allocated memory is both supported and enabled. The existing version of getThreadAllocatedBytes(long []) calls verifyThreadAllocatedMemory(long []), which checks inline to make sure thread allocated memory is supported, then calls isThreadAllocatedMemoryEnabled() to verify that it's enabled. isThreadAllocatedMemoryEnabled() duplicates (!) the support check and returns the enabled flag. I removed the redundant check in the new version.

Thanks for clarifying.

> You're of course correct about the back-to-back check. Application code can't know when the runtime will hijack a thread for its own purposes. I've removed the check.

Updated test looks fine.

Nothing further from me.

Thanks,
David
-----

> Paul
> 
> On 9/13/19, 12:50 AM, "David Holmes" <david.holmes at oracle.com> wrote:
> 
>      Hi Paul,
>      
>      On 13/09/2019 10:29 am, Hohensee, Paul wrote:
>      > Thanks for clarifying the review rules. Would someone from the
>      > serviceability team please review? New webrev at
>      >
>      > http://cr.openjdk.java.net/~phh/8207266/webrev.07/
>      
>      One aspect of the functional change needs clarification for me - and
>      apologies if this has been covered in the past. It seems to me that
>      currently we only check isThreadAllocatedMemorySupported for these
>      operations, but if I read things correctly the updated code additionally
>      checks isThreadAllocatedMemoryEnabled, which is a behaviour change not
>      mentioned in the CSR.
>      
>      > I didn’t disturb the existing checks in the test, just added code to
>      > check the result of getThreadAllocatedBytes(long) on a non-current
>      > thread, plus the back-to-back no-allocation checks. The former wasn’t
>      > needed before because getThreadAllocatedBytes(long) was just a wrapper
>      > around getThreadAllocatedBytes(long []). This patch changes that, so I
>      > added a separate test. The latter is supposed to fail if there’s object
>      > allocation on calls to getCurrentThreadAllocatedBytes and
>      > getThreadAllocatedBytes(long). I.e., a feature, not a bug, because
>      > accumulation of transient small objects can be a performance problem.
>      > Thanks to your review, I noticed that the back-to-back check on the
>      > current thread was using getThreadAllocatedBytes(long) instead of
>      > getCurrentThreadAllocatedBytes and fixed it. I also removed all
>      > instances of “TEST FAILED: “.
>      
>      The back-to-back check is not valid in general. You don't know if the
>      first check might trigger some class loading on the return path after it
>      has obtained the first memory value. The check might also fail if using
>      JVMCI and some compilation related activity occurs in the current thread
>      on the second call. Also with the introduction of handshakes its
>      possible the current thread might hit a safepoint checks that results in
>      it executing a handshake operation that performs allocation. Potentially
>      there could be numerous non-deterministic actions that might occur
>      leading to unanticipated allocation.
>      
>      I understand what you want to test here, I just don't think it is
>      reliably doable.
>      
>      Thanks,
>      David
>      -----
>      
>      >
>      > Paul
>      >
>      > *From: *Mandy Chung <mandy.chung at oracle.com>
>      > *Date: *Thursday, September 12, 2019 at 10:09 AM
>      > *To: *"Hohensee, Paul" <hohensee at amazon.com>
>      > *Cc: *OpenJDK Serviceability <serviceability-dev at openjdk.java.net>,
>      > "hotspot-gc-dev at openjdk.java.net" <hotspot-gc-dev at openjdk.java.net>
>      > *Subject: *Re: RFR (M): 8207266: ThreadMXBean::getThreadAllocatedBytes()
>      > can be quicker for self thread
>      >
>      > On 9/3/19 12:38 PM, Hohensee, Paul wrote:
>      >
>      >     Minor update in new webrevhttp://cr.openjdk.java.net/~phh/8207266/webrev.05/.
>      >
>      >
>      > I only reviewed the library side implementation that looks good.  I
>      > expect the serviceability team to review the test and hotspot change.
>      >
>      >
>      >     Need a confirmatory review to push this. If I understand the rules correctly, it doesn't need a Reviewer review since Mandy's already reviewed it, it just needs a Committer review.
>      >
>      >
>      > You need another reviewer to advice the following because I was not
>      > close to the ThreadsList work.
>      >
>      > 2087   ThreadsListHandle tlh;
>      >
>      > 2088   JavaThread* java_thread = tlh.list()->find_JavaThread_from_java_tid(thread_id);
>      >
>      > 2089
>      >
>      > 2090   if (java_thread != NULL) {
>      >
>      > 2091     return java_thread->cooked_allocated_bytes();
>      >
>      > 2092   }
>      >
>      > This looks right to me.
>      >
>      > test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java
>      >
>      > -                "ThreadAllocatedMemory is expected to be disabled");
>      >
>      > +                "TEST FAILED: ThreadAllocatedMemory is expected to be
>      > disabled");
>      >
>      > Prepending "TEST FAILED" in exception message (in several places)
>      >
>      > seems redundant since such RuntimeException is thrown and expected
>      >
>      > a test failure.
>      >
>      > +        // back-to-back calls shouldn't allocate any memory
>      >
>      > +        size = mbean.getThreadAllocatedBytes(id);
>      >
>      > +        size1 = mbean.getThreadAllocatedBytes(id);
>      >
>      > +        if (size1 != size) {
>      >
>      > Is there anything in the test can do to help guarantee this? I didn't
>      >
>      > closely review this test.  The main thing I advice is to improve
>      >
>      > the reliability of this test.  Put it in another way, we want to
>      >
>      > ensure that this test change will pass all the time in various
>      >
>      > test configuration.
>      >
>      > Mandy
>      >
>      
> 


More information about the serviceability-dev mailing list