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

Daniel D. Daugherty daniel.daugherty at oracle.com
Thu Sep 19 00:34:41 UTC 2019


I have the backout ready to go. About to send out a webrev...

Dan

On 9/18/19 8:25 PM, Daniel D. Daugherty wrote:
> I created this sub-task for you:
>
> JDK-8231210 [BACKOUT] JDK-8207266 
> ThreadMXBean::getThreadAllocatedBytes() can be quicker for self thread
> https://bugs.openjdk.java.net/browse/JDK-8231210
>
> If you would prefer, I can handle this backout for you.
>
> Dan
>
>
> On 9/18/19 8:21 PM, Hohensee, Paul wrote:
>> Never having done this before, is it
>>
>> hg backout -r <original commit id>
>>
>> ? Do I file a JBS issue for the reversion? Seems necessary.
>>
>> On 9/18/19, 5:18 PM, "Daniel D. Daugherty" 
>> <daniel.daugherty at oracle.com> wrote:
>>
>>      % hg backout
>>           is the usual way to do this...
>>           Dan
>>                On 9/18/19 8:17 PM, Hohensee, Paul wrote:
>>      > Is there a tool that will generate a reversal patch?
>>      >
>>      > On 9/18/19, 5:14 PM, "Daniel D. Daugherty" 
>> <daniel.daugherty at oracle.com> wrote:
>>      >
>>      >       > Shall I go with that, or reverse the original patch?
>>      >
>>      >      I'm a bit worried about what else might show up since the
>>      >      NSK monitoring tests were not run prior to this push.
>>      >
>>      >      I vote for backing out the fix until proper testing has
>>      >      been done (and at least the one problem fixed...)
>>      >
>>      >      Dan
>>      >
>>      >
>>      >      On 9/18/19 8:00 PM, Hohensee, Paul wrote:
>>      >      > They all implement com.sun.management.ThreadMXBean, so 
>> adding a getCurrentThreadAllocatedBytes broke them. Potential fix is 
>> to give it a default implementation, vis
>>      >      >
>>      >      >      public default long 
>> getCurrentThreadAllocatedBytes() {
>>      >      >          return -1;
>>      >      >      }
>>      >      >
>>      >      > Shall I go with that, or reverse the original patch?
>>      >      >
>>      >      > On 9/18/19, 4:48 PM, "serviceability-dev on behalf of 
>> Hohensee, Paul" <serviceability-dev-bounces at openjdk.java.net on 
>> behalf of hohensee at amazon.com> wrote:
>>      >      >
>>      >      >      I'll take a look.
>>      >      >
>>      >      >      On 9/18/19, 4:40 PM, "David Holmes" 
>> <david.holmes at oracle.com> wrote:
>>      >      >
>>      >      >          Paul,
>>      >      >
>>      >      >          Unfortunately this patch has broken the 
>> vmTestbase/nsk/monitoring tests:
>>      >      >
>>      >      >          [2019-09-18T22:59:32,349Z]
>>      >      > 
>> /scratch/mesos/jib-master/install/jdk-14+15-615/src.full/open/test/hotspot/jtreg/vmTestbase/nsk/monitoring/share/server/ServerThreadMXBeanNew.java:32:
>>      >      >          error: ServerThreadMXBeanNew is not abstract 
>> and does not override
>>      >      >          abstract method 
>> getCurrentThreadAllocatedBytes() in ThreadMXBean
>>      >      >
>>      >      >          and possibly other issues as we are seeing 
>> hundreds of failures.
>>      >      >
>>      >      >          David
>>      >      >
>>      >      >          On 18/09/2019 8:50 am, David Holmes wrote:
>>      >      >          > On 18/09/2019 12:10 am, Hohensee, Paul wrote:
>>      >      >          >> Thanks, Serguei. :)
>>      >      >          >>
>>      >      >          >> David, are you ok with the patch?
>>      >      >          >
>>      >      >          > Yep, nothing further from me.
>>      >      >          >
>>      >      >          > David
>>      >      >          >
>>      >      >          >> Paul
>>      >      >          >>
>>      >      >          >> *From: *"serguei.spitsyn at oracle.com" 
>> <serguei.spitsyn at oracle.com>
>>      >      >          >> *Date: *Tuesday, September 17, 2019 at 2:26 AM
>>      >      >          >> *To: *"Hohensee, Paul" 
>> <hohensee at amazon.com>, David Holmes
>>      >      >          >> <david.holmes at oracle.com>, Mandy Chung 
>> <mandy.chung at oracle.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
>>      >      >          >>
>>      >      >          >> Hi Paul,
>>      >      >          >>
>>      >      >          >> Thank you for refactoring and fixing the test.
>>      >      >          >> It looks great now!
>>      >      >          >>
>>      >      >          >> Thanks,
>>      >      >          >> Serguei
>>      >      >          >>
>>      >      >          >>
>>      >      >          >> On 9/15/19 02:52, Hohensee, Paul wrote:
>>      >      >          >>
>>      >      >          >>     Hi, Serguei, thanks for the review. New 
>> webrev at
>>      >      >          >>
>>      >      >          >> 
>> http://cr.openjdk.java.net/~phh/8207266/webrev.09/
>>      >      >          >>
>>      >      >          >>     I refactored the test’s main() method, 
>> and you’re correct,
>>      >      >          >> getThreadAllocatedBytes should be 
>> getCurrentThreadAllocatedBytes in
>>      >      >          >>     that context: fixed.
>>      >      >          >>
>>      >      >          >>     Paul
>>      >      >          >>
>>      >      >          >>     *From: *"serguei.spitsyn at oracle.com"
>>      >      >          >> <mailto:serguei.spitsyn at oracle.com> 
>> <serguei.spitsyn at oracle.com>
>>      >      >          >> <mailto:serguei.spitsyn at oracle.com>
>>      >      >          >>     *Organization: *Oracle Corporation
>>      >      >          >>     *Date: *Friday, September 13, 2019 at 
>> 5:50 PM
>>      >      >          >>     *To: *"Hohensee, Paul" 
>> <hohensee at amazon.com>
>>      >      >          >> <mailto:hohensee at amazon.com>, David Holmes 
>> <david.holmes at oracle.com>
>>      >      >          >> <mailto:david.holmes at oracle.com>, Mandy Chung
>>      >      >          >> <mandy.chung at oracle.com> 
>> <mailto:mandy.chung at oracle.com>
>>      >      >          >>     *Cc: *OpenJDK Serviceability 
>> <serviceability-dev at openjdk.java.net>
>>      >      >          >> <mailto:serviceability-dev at openjdk.java.net>,
>>      >      >          >> "hotspot-gc-dev at openjdk.java.net"
>>      >      >          >> <mailto:hotspot-gc-dev at openjdk.java.net>
>>      >      >          >> <hotspot-gc-dev at openjdk.java.net>
>>      >      >          >> <mailto:hotspot-gc-dev at openjdk.java.net>
>>      >      >          >>     *Subject: *Re: RFR (M): 8207266:
>>      >      >          >> ThreadMXBean::getThreadAllocatedBytes() can 
>> be quicker for self
>>      >      >          >> thread
>>      >      >          >>
>>      >      >          >>     Hi Paul,
>>      >      >          >>
>>      >      >          >>     It looks pretty good in general.
>>      >      >          >>
>>      >      >          >>
>>      >      >          >> 
>> http://cr.openjdk.java.net/~phh/8207266/webrev.08/test/jdk/com/sun/management/ThreadMXBean/ThreadAllocatedMemory.java.frames.html
>>      >      >          >>
>>      >      >          >>
>>      >      >          >>     It would be nice to refactor the java 
>> main() method as it becomes
>>      >      >          >>     too big.
>>      >      >          >>     Two ways 
>> ofgetCurrentThreadAllocatedBytes() testing are good
>>      >      >          >> candidates
>>      >      >          >>     to become separate methods.
>>      >      >          >>
>>      >      >          >>        98         long size1 = 
>> mbean.getThreadAllocatedBytes(id);
>>      >      >          >>
>>      >      >          >>     Just wanted to double check if you 
>> wanted to invoke
>>      >      >          >>     the getCurrentThreadAllocatedBytes() 
>> instead as it is
>>      >      >          >>     a part of:
>>      >      >          >>
>>      >      >          >>        85         // First way, 
>> getCurrentThreadAllocatedBytes
>>      >      >          >>
>>      >      >          >>
>>      >      >          >>     Thanks,
>>      >      >          >>     Serguei
>>      >      >          >>
>>      >      >          >>     On 9/13/19 12:11 PM, 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.
>>      >      >          >>
>>      >      >          >>
>>      >      >          >>         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.
>>      >      >          >>
>>      >      >          >>
>>      >      >          >>         Paul
>>      >      >          >>
>>      >      >          >>
>>      >      >          >>         On 9/13/19, 12:50 AM, "David 
>> Holmes"<david.holmes at oracle.com>
>>      >      >          >> <mailto: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>
>>      >      >          >> <mailto:mandy.chung at oracle.com>
>>      >      >          >>
>>      >      >          >>              > *Date: *Thursday, September 
>> 12, 2019 at 10:09 AM
>>      >      >          >>
>>      >      >          >>              > *To: *"Hohensee, 
>> Paul"<hohensee at amazon.com>
>>      >      >          >> <mailto:hohensee at amazon.com>
>>      >      >          >>
>>      >      >          >>              > *Cc: *OpenJDK
>>      >      >          >> 
>> Serviceability<serviceability-dev at openjdk.java.net>
>>      >      >          >> <mailto:serviceability-dev at openjdk.java.net>,
>>      >      >          >>
>>      >      >          >> >"hotspot-gc-dev at openjdk.java.net"
>>      >      >          >> <mailto:hotspot-gc-dev at openjdk.java.net>
>>      >      >          >> <hotspot-gc-dev at openjdk.java.net>
>>      >      >          >> <mailto: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 hotspot-gc-dev mailing list