RFR: JDK-8229871: Improve performance of Method.copy() and leafCopy()
Kazunori Ogata
OGATAK at jp.ibm.com
Wed Aug 21 11:02:40 UTC 2019
Hi Mandy,
Thank you for reviewing the webrev. I updated it to add a space after
"if" and also put four spaces for indentation (it was three).
http://cr.openjdk.java.net/~ogatak/8229871/webrev.01/
Thank you so much for checking the history of fieldAccessor. I was
surprised that fieldAccessor was made non-volatile in JDK5, but
methodAccessor was left as volatile for 15 years after that...
I agree we need benchmark data. My simple micro benchmark that repeats
invoking Class.getMethods() improved performance by 70% when it made
non-volatile (as shown in the following webrev). I'll try to run larger
benchmarks, such as SPECjbb2015, to see real impact.
http://cr.openjdk.java.net/~ogatak/8229871/webrev.02/
Regards,
Ogata
Mandy Chung <mandy.chung at oracle.com> wrote on 2019/08/21 01:21:42:
> From: Mandy Chung <mandy.chung at oracle.com>
> To: Kazunori Ogata <OGATAK at jp.ibm.com>
> Cc: core-libs-dev at openjdk.java.net
> Date: 2019/08/21 01:21
> Subject: [EXTERNAL] Re: RFR: JDK-8229871: Imporve performance of
> Method.copy() and leafCopy()
>
> Hi Ogata,
>
> The patch looks okay. Nit: please add a space between if and (.
>
> About volatile methodAccessor field, I checked the history. Both
> fieldAccessor and methodAccessor were started as volatile and the
> fieldAccessor declaration was updated due to JDK-5044412. As you
> observe, I think the methodAccessor field could be made non-volatile.
> OTOH that might impact when it's inflated to spin bytecode for this
> method invocation. I don't know how importance to keep its volatile vs
> non-volatile in practice without doing benchmarking/real application
> testing.
>
> Mandy
>
> On 8/19/19 2:51 AM, Kazunori Ogata wrote:
> > Hi,
> >
> > May I have review for "JDK-8229871: Imporve performance of
Method.copy()
> > and leafCopy()"?
> >
> > Method.copy() and leafCopy() creates a copy of a Method object with
> > sharing MethodAccessor object. Since the methodAccessor field is a
> > volatile variable, copying this field needs memory fence to ensure the
> > field is visible to all threads on the weak memory platforms such as
POWER
> > and ARM.
> >
> > When the methodAccessor of the root object is null (i.e., not
initialized
> > yet), we do not need to copy the null value because this field of the
> > copied object has been initialized to null in the constructor. We can
> > reduce overhead of the memory fence only when the root's
methodAccessor is
> > non-null. This change improved performance by 5.8% using a micro
benchmark
> > that repeatedly invokes Class.getMethods().
> >
> > Bug: https://bugs.openjdk.java.net/browse/JDK-8229871
> >
> > Webrev: http://cr.openjdk.java.net/~ogatak/8229871/webrev.00/
> >
> >
> > By the way, why Method.methodAccessor is volatile, while
> > Field.fieldAccessor and Field.overrideFieldAccessor are not volatile?
I
> > know the use of volatile reduces probability of creating duplicated
method
> > accessor, but the chance still exists. I couldn't find the difference
> > between Method and Field classes to make Method.methodAccessor
volatile.
> > If we can make it non-volatile, it is more preferable than a quick
hack
> > above.
> >
> >
> > Regards,
> > Ogata
> >
>
>
More information about the core-libs-dev
mailing list