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

Hohensee, Paul hohensee at amazon.com
Thu Sep 19 00:10:02 UTC 2019


I've filed https://bugs.openjdk.java.net/browse/JDK-8231209 for this quick fix. A better fix is to support getCurrentThreadAllocatedBytes in these tests.

On 9/18/19, 5:02 PM, "hotspot-gc-dev on behalf of Hohensee, Paul" <hotspot-gc-dev-bounces at openjdk.java.net on behalf of hohensee at amazon.com> 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 serviceability-dev mailing list