Dan,

Thank you for adding serviceability. I'll provide more detail on the change if needed. Here's some additional detail.

What I did was added a closure to pass to ClassLoaderDataGraph::classes_do() function. This function walks all the loaded classes, which includes the array classes. The SystemDicitonary walk only walks loaded InstanceKlasses. The array classes created are linked from the InstanceKlass in _array_klasses and the code used to walk them separately. The code for switching to the new methods from the old methods didn't change very much.

The reason we have to change the vtables in array classes is because array classes are inherited from java/lang/Object class and have this vtable. We had missed the ones for arrays of basic types created in universe. The old code never fixed these entries but it didn't crash because the methodOops were followed with the basic type array classes in their vtable so wouldn't go away. With permgen removal, we explicitly delete unreferenced Method objects so these ones have to be replaced. And it's more correct because you don't want to call the old Method.

Coleen

On 05/09/2013 09:55 AM, Daniel D. Daugherty wrote:
Adding Serviceability to this review thread since this concerns
JVM/TI RedefineClasses().

Coleen, this will take a bit of time to review.

Dan


On 5/8/13 8:51 PM, Coleen Phillimore wrote:
Summary: Need to walk array class vtables replacing old methods too if j.l.o is redefined

Array methods aren't in the SystemDictionary and the code that was there didn't walk the basic type array classes defined in universe. It also walked the same classes more than once. Use the ClassLoaderDataGraph class walking instead.

open webrev at http://cr.openjdk.java.net/~coleenp/8005056/
bug link at http://bugs.sun.com/view_bug.do?bug_id=8005056

Tested with all redefine classes tests, jdk java/lang/instrument tests, hotspot jtreg tests.

Thanks,
Coleen



Reply via email to