> open webrev at http://cr.openjdk.java.net/~coleenp/8005056/
Thumbs up. Minor nits/questions below.
Very nicely done. Adding a test to retransform java.lang.Object
will do a nice job of detecting potential breakages in this area.
src/share/vm/classfile/dictionary.cpp
No comments.
src/share/vm/classfile/dictionary.hpp
No comments.
src/share/vm/classfile/systemDictionary.cpp
No comments.
src/share/vm/classfile/systemDictionary.hpp
No comments.
src/share/vm/oops/klass.hpp
No comments.
src/share/vm/prims/jvmtiRedefineClasses.cpp
line 3547: // print error if old methods are found.
We fail a guarantee here also so this is more than "print error".
line 3551 } else {
Indent is off by one space (not your change, but...)
src/share/vm/prims/jvmtiRedefineClasses.hpp
No comments.
test/testlibrary/ClassFileInstaller.java
line 43: String pathName = arg.replace('.', '/').concat(".class");
line 48: if (pathName.contains("/")) {
Should these be System.getProperty("path.separator")? Or maybe
this is something already queried and cached in this testing
harness?
test/runtime/RedefineObject/Agent.java
line 56: for (int i = 0; i< 1000 ; i++) {
Space before '<'.
test/runtime/RedefineObject/MANIFEST.MF
No comments (agree with Christian that this can be deleted)
test/runtime/RedefineObject/Test.java
No comments (agree with Christian that this should be renamed).
Dan
On 5/9/13 8:22 AM, Coleen Phillimore wrote:
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