On 3/12/15 11:27 PM, serguei.spit...@oracle.com wrote:
Please, review the jdk 9 fix for:
https://bugs.openjdk.java.net/browse/JDK-8067662
Open hotspot webrev:
http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/hotspot/8067662-JVMTI-trace.1/
Thumbs up. None of these comments are critical.
src/share/vm/classfile/javaClasses.hpp
No comments.
src/share/vm/classfile/javaClasses.cpp
line 1316: return method != NULL &&
(method->constants()->version() == version
line 1317: && version < MAX_VERSION);
Don't really need the parens and the indenting implies
a logical grouping that isn't really there. Perhaps:
return method != NULL && method->constants()->version() ==
version
&& version < MAX_VERSION;
Although I also wonder why the caller would pass a 'version'
value that is >= MAX_VERSION. Perhaps this instead:
assert(version < MAX_VERSION, "version is too big");
return method != NULL && method->constants()->version() ==
version
line 1347: typeArrayOop _cprefs;
Perhaps add a comment: // needed to insulate method name
against redefinition
line 1486: holder = holder->get_klass_version(version); // Use
specific ik version as a holder
Perhaps the following comment instead:
// Use specific ik version as a holder since the mirror might
// refer to version that is now obsolete.
I'm not sure "obsolete" is the right term here, but say
something about why the mirror version is not good enough.
Update: 'obsolete' is the right term now that I've re-read the
code review invite! Perhaps this is better:
// Use specific ik version as a holder since the mirror might
// refer to version that is now obsolete and no longer accessible
// via the previous versions list.
line 1854: // Get method id, cpref, bci, version and mirror from
chunk
Perhaps:
// Get method id, bci, version, mirror and cpref from chunk
since that's the order you do the work...
line 1909: holder = holder->get_klass_version(version); // Use
specific ik version as a holder
Similar comment as on line 1486.
src/share/vm/oops/instanceKlass.hpp
No comments.
src/share/vm/oops/instanceKlass.cpp
No comments.
Open webrev for unit test update:
http://cr.openjdk.java.net/~sspitsyn/webrevs/2015/jdk/8067662-JVMTI-trace-test.1/
test/java/lang/instrument/RedefineMethodInBacktrace.sh
No comments.
test/java/lang/instrument/RedefineMethodInBacktraceApp.java
line 175: System.exit(1);
A comment to explain why this test needs to exit on
failure would be good. When the work to get rid of
shell script driven tests gets here, it would be
useful for understanding why this test must be
standalone.
test/java/lang/instrument/RedefineMethodInBacktraceTarget.java
No comments.
test/java/lang/instrument/RedefineMethodInBacktraceTargetB.java
No comments.
test/java/lang/instrument/RedefineMethodInBacktraceTargetB_2.java
No comments.
test/java/lang/instrument/RedefineMethodInBacktraceTarget_2.java
No commetns.
Dan
Summary:
An NPE is trown in a thread dumping via JMX when doing CPU profiling
in NetBeans Profiler and VisualVM.
The issue is that the methods and related klass versions are not
kept alive if a class redefinition
takes place between catching a Throwable and taking a thread dump.
It can result in loosing an obsolete method, and so, the
reconstruction of method name becomes impossible.
In such a case, the null reference is returned instead of a valid
method name.
The solution is to use current klass version and method orig_idnum
instead of ordinary method idnum
to find required method pointer. In the worst case when the related
klass version is gone
(was not included to or was removed from the previous_versions
linked list), a saved method name
CP index of the latest klass version can be used to restore the
method name.
The footprint extra overhead for this approach is u2 per stack frame.
The plan is also to backport the fix to 8u60.
Testing:
In progress: nsk redefine classes tests, JTREG java/lang/instrument
Thanks,
Serguei