Hi all, First, thanks all of you that are involved in this!
I agree with David here, lets split this up (for now) and do reflective objects in the context of jep-149 and annotations separately. As you may know there are even more annotation coming in with JSR 308 annotations on type (use), so I want to complete that work first and then do the effort of reducing contention and overhead for both type and regular annotations and also fixing up the behaviour for redefine/retransform class. One other point to consider is that some of the fields in java/lang/reflect/ classes are known by the VM so not all changes in Java-land are actually doable. Glancing over your patches very quickly I don't think you have done anything to upset the VM, but then I am not an expert in this area. Also, with the VM permgen changes we might have to rethink our assumptions in order to reduce total overhead. For example as I understand it previously we could just ship the same pointer into permgen for the annotations arrays, now that isn't possible so we create a new copy of the array for every Field/Method/Constructor instance. Perhaps there is some clever way of eliminating those copies. So while I think your patches generally makes sense, I think it is prudent to delay this for annotations until all our new annotation features are in. cheers /Joel On Dec 10, 2012, at 7:18 AM, David Holmes <david.hol...@oracle.com> wrote: > Hi Peter, > > Sorry for the delay on this. > > Generally your VolatileData and my ReflectionHelper are doing a similar job. > But I agree with your reasoning that all of the cached SoftReferences are > likely to be cleared at once, and so a SoftReference to a helper object with > direct references, is more effective than a direct reference to a helper > object with SoftReferences. My initial stance with this was very conservative > as the more change that is introduced the more uncertainty there is about the > impact. > > I say the above primarily because I think, if I am to proceed with this, I > will need to separate out the general reflection caching changes from the > annotation changes. There are a number of reasons for this: > > First, I'm not at all familiar with the implementation of annotations at the > VM or Java level, and the recent changes in this area just exacerbate my > ignorance of the mechanics. So I don't feel qualified to evaluate that aspect. > > Second, the bulk of the reflection caching code is simplified by the fact > that due to current constraints on class redefinition the caching is > effectively idempotent for fields/methods/constructors. But that is not the > case for annotations. > > Finally, the use of synchronization with the annotations method is perplexing > me. I sent Joe a private email on this but I may as well raise it here - and > I think you have alluded to this in your earlier emails as well: > initAnnotationsIfNecessary() is a synchronized instance method but I can not > find any other code in the VM that synchronizes on the Class object's > monitor. So if this synchronization is trying to establish consistency in the > face of class redefinition, I do not see where class redefinition is > participating in the synchronization! > > So what I would like to do is take your basic VolatileData part of the patch > and run with it for JEP-149 purposes, while separating the annotations issue > so they can be dealt with by the experts in that particular area. > > I'm sorry it has taken so long to arrive at a fairly negative position, but I > need someone else to take up the annotations gauntlet and run with it. > > Thanks, > David > > On 3/12/2012 5:41 PM, Peter Levart wrote: >> Hi David, Alan, Alexander and others, >> >> In the meanwhile I have added another annotations space optimization to >> the patch. If a Class doesn't inherit any annotations from a superclass, >> which I think is a common case, it assigns the same Map instance to >> "annotations" as well as "declaredAnnotations" fields. Previously - and >> in the original code - this only happened for java.lang.Object and >> interfaces. >> >> Here's the updated webrev: >> >> http://dl.dropbox.com/u/101777488/jdk8-tl/JEP-149/webrev.02/index.html >> >> I have also rewritten the performance micro-benchmarks. With the >> addition of repeating annotations, one performance aspect surfaces: when >> asking for a particular annotation type on a Class and that annotation >> is not present, the new repeating annotations support method >> AnnotationSupport.getOneAnnotation asks for @ContainedBy meta-annotation >> on the annotation type. This can result in an even more apparent >> synchronization hot-spot with original code that uses synchronized >> initAnnotationsIfNecessary(). This aspect is tested with the 3rd test. >> Other 2 tests test the same thing as before but are more stable now, >> since now they measure retrieval of 5 different annotation types from >> each AnnotatedElement, previously they only measured retrieval of 1 >> which was very sensitive to HashMap irregularities (it could happen that >> a particular key mapped to a bucket that was overloaded in one test-run >> and not in another)... >> >> Here're the new tests: >> >> https://raw.github.com/plevart/jdk8-tl/JEP-149/test/src/test/ReflectionTest.java >> >> And the corresponding results when run on an i7 CPU on Linux: >> >> https://raw.github.com/plevart/jdk8-tl/JEP-149/test/benchmark_results_i7-2600K.txt >> >> >> Regards, Peter >> >> >> >> On 12/03/2012 02:15 AM, David Holmes wrote: >>> On 1/12/2012 4:54 AM, Alan Bateman wrote: >>>> On 30/11/2012 18:36, Peter Levart wrote: >>>>> : >>>>> >>>>> So, what do you think? What kind of tests should I prepare in addidion >>>>> to those 3 so that the patch might get a consideration? >>>> I think this is good work and thanks for re-basing your patch. I know >>>> David plans to do a detail review. I think it will require extensive >>>> performance testing too, perhaps with some large applications. >>> >>> Indeed I do plan a detailed review and have initiated some initial >>> performance tests. >>> >>> I am also swamped but will try to get to the review this week - and >>> will also need to check the referenced annotations updates. >>> >>> David >>> >>>> -Alan >>>> >>