On 01/10/2013 02:25 AM, Mandy Chung wrote:
On 1/6/2013 2:46 PM, David Holmes wrote:

http://cr.openjdk.java.net/~dholmes/8005232/webrev/

This looks good to me. David - besides the footprint performance data,
do you observe any performance difference in your performance testing
(I think refworkload is what you ran)?

On 01/09/2013 01:19 PM, Aleksey Shipilev wrote:
On 01/09/2013 05:04 PM, Peter Levart wrote:

Strictly speaking, CAS is actually not needed here. Since we keep
classRedefinedCount snapshot inside the ReflectionData, any races that
would install "older" ReflectionData over "newer", would be quickly
caught at next invocation to reflectionData(). So if there are any
objections to usage of Unsafe, it can be removed and replaced by simple
volatile write.

Yes, I think that would be more clear without any adverse impacts on
performance. Also, that better expresses the intent of requiring the
visibility, not the atomicity of cache update.

I agree with Alekesey that it'd be simpler and clearer if CAS is replaced
with the simple volatile write. But this change will require another round of performance measurement to determine its impact. I'd suggest to follow
up this cleanup in a separate bug and changeset.

Mandy
FWIW, I ran my micro benchmarks with the variant of using simple volatile write instead of CAS and there was no visible differences. But I don't have access to 256 core machines ;-). Anyway I think It should not present any performance difference, since the rate of class re-definitions is usually not very high...

Although the slow-path is a simple as:

this.reflectionData = new SoftReference<>(rd = new ReflectionData<>(classRedefinitionCount));
return rd;

... I had to split this too into a separate method to retain the same inlienability.

Such fine-tunnings tend to be lost in other sub-optimalities of the code that implements public reflection API, such as copying the arrays and array elements in bulk-returning methods and linear searches for the elements in single-element returning methods...

There is another simplification of code possible. The method checkInited() and its usages could be removed and it's logic incorporated into the slow-path newReflectionData() method while adding another boolean variable test into the fast-path.

Regards, Peter

Reply via email to