Just a short non critical observation, what happens when numDefs==0?
-kto
On Dec 21, 2011, at 8:47 PM, Daniel D. Daugherty wrote:
> Thanks for reviewing both!
>
> I haven't thought of any good tracing additions to the
> ClassFileLoadHook code path... but when I do...
>
> Dan
>
> On 12/21/11 9:40 PM, Poonam Bajaj wrote:
>>
>> Hi Dan,
>>
>> I have looked at both the JDK and the Hotspot changes, so you can add me as
>> reviewer for both.
>>
>> I especially like the class_load_kind addition to the following trace.
>>
>> 856 RC_TRACE_WITH_THREAD(0x00000001, THREAD,
>> 857 ("loading name=%s kind=%d (avail_mem=" UINT64_FORMAT "K)",
>> 858 the_class->external_name(), _class_load_kind,
>> 859 os::available_memory() >> 10));
>>
>> Thanks,
>> Poonam
>>
>> On 12/22/2011 8:53 AM, Daniel D. Daugherty wrote:
>>>
>>> Poonam,
>>>
>>> I forgot to ask whether to put you down as a reviewer for both
>>> the JDK fix and the HSX fix... so JDK only or both JDK and HSX?
>>>
>>> Dan
>>>
>>>
>>> On 12/21/11 8:22 PM, Daniel D. Daugherty wrote:
>>>>
>>>> On 12/21/11 8:05 PM, Poonam Bajaj wrote:
>>>>>
>>>>> Hi Dan,
>>>>>
>>>>> In the following block (in JPLISAgent.c):
>>>>>
>>>>> 1278 if (!errorOccurred) {
>>>>> 1279 jvmtiError errorCode = JVMTI_ERROR_NONE;
>>>>> 1280 errorCode =
>>>>> (*jvmtienv)->RedefineClasses(jvmtienv, numDefs, classDefs);
>>>>> 1281 if (errorCode == JVMTI_ERROR_WRONG_PHASE) {
>>>>> 1282 /* insulate caller from the wrong phase
>>>>> error */
>>>>> 1283 errorCode = JVMTI_ERROR_NONE;
>>>>> 1284 } else {
>>>>> 1285 errorOccurred = (errorCode !=
>>>>> JVMTI_ERROR_NONE);
>>>>> 1286 if ( errorOccurred ) {
>>>>> 1287
>>>>> createAndThrowThrowableFromJVMTIErrorCode(jnienv, errorCode);
>>>>> 1288 }
>>>>> 1289 }
>>>>> 1290 }
>>>>>
>>>>> If RedefineClasses() fails here then
>>>>> createAndThrowThrowableFromJVMTIErrorCode() is being called. At the point
>>>>> we would have filled data (upto the value of index 'i') into classDefs
>>>>> and targetFiles but in case of RedefineClasses failure, those will not
>>>>> get freed. Is that correct ?
>>>>
>>>> No that is not correct and it fooled me also!
>>>>
>>>> The createAndThrowThrowableFromJVMTIErrorCode() call
>>>> does create and throw a throwable Java object, but the
>>>> redefineClasses() function does not stop executing at
>>>> that point. It finishes what it was doing, freeing
>>>> memory that needs to be freed before returning at the
>>>> end of the function. Darn C-code doesn't behave like
>>>> Java code. :-)
>>>>
>>>> Dan
>>>>
>>>>
>>>>>
>>>>>
>>>>> Thanks,
>>>>> Poonam
>>>>>
>>>>>
>>>>> On 12/22/2011 4:46 AM, Daniel D. Daugherty wrote:
>>>>>>
>>>>>> On 12/21/11 4:07 PM, Karen Kinnear wrote:
>>>>>>> Dan,
>>>>>>>
>>>>>>> Thank you for the quick fix -
>>>>>>
>>>>>> You're welcome. I'm trying to get this off my plate before
>>>>>> I leave for the holidays... so not exactly altruistic... :-)
>>>>>>
>>>>>>
>>>>>>> I echo Coleen's sentiments of wondering how
>>>>>>> you managed to find the problem(s).
>>>>>>
>>>>>> I'll send a reply on that topic later...
>>>>>>
>>>>>>
>>>>>>> On Dec 21, 2011, at 5:41 PM, Daniel D. Daugherty wrote:
>>>>>>>
>>>>>>>> Karen,
>>>>>>>>
>>>>>>>> Thanks for the quick review! Replies in-lined below...
>>>>>>>>
>>>>>>>>
>>>>>>>> On 12/21/11 2:47 PM, Karen Kinnear wrote:
>>>>>>>>> Dan,
>>>>>>>>>
>>>>>>>>> All versions of hotspot changes look good.
>>>>>>>> Thanks! Are you OK if I don't wait for someone from the new
>>>>>>>> Serviceability team on this review? Serguei has already left
>>>>>>>> for the holidays... and I told him to ignore any e-mails from
>>>>>>>> me :-)
>>>>>>> Yes - go for it. Given the holiday timing and how critical this fix
>>>>>>> is - you have reviews from Coleen and from me.
>>>>>>
>>>>>> I have two HSX reviews (yeah!) and I have one JDK review.
>>>>>> I need one more JDK review...
>>>>>>
>>>>>>
>>>>>>>>
>>>>>>>>> For the JDK and test side:
>>>>>>>>> 1) minor: JPLISAgent.c - new lines 1210-1212 might just be an } else
>>>>>>>>> {
>>>>>>>> Nice catch! This line:
>>>>>>>>
>>>>>>>> 1212 if (!errorOccurred) {
>>>>>>>>
>>>>>>>> should change back to:
>>>>>>>>
>>>>>>>> 1212 else {
>>>>>>>>
>>>>>>>> I missed that when I was backing out some more complicated
>>>>>>>> stuff that I gave up on.
>>>>>>>>
>>>>>>>> Fixed in all three versions.
>>>>>>>>
>>>>>>>>
>>>>>>>>> 2) new lines 1311-1312
>>>>>>>>> Why do you break if an error occurred?
>>>>>>>> Because I was trying to match the existing style
>>>>>>>> too much. The for-loop from lines 1235-1276 does
>>>>>>>> that: if I have an error, then break...
>>>>>>>>
>>>>>>>>
>>>>>>>>> If there is a reason to stop freeing memory, would that also
>>>>>>>>> apply if
>>>>>>>>> you already had had an error? So you would want to check a new
>>>>>>>>> cleanuperrorOccurred
>>>>>>>>> regardless of pre-existing error?
>>>>>>>>> But I suspect leaving out the break would make more sense.
>>>>>>>> For this block:
>>>>>>>>
>>>>>>>> 1304 /*
>>>>>>>> 1305 * Only check for error if we didn't
>>>>>>>> already have one
>>>>>>>> 1306 * so we don't overwrite errorOccurred.
>>>>>>>> 1307 */
>>>>>>>> 1308 if (!errorOccurred) {
>>>>>>>> 1309 errorOccurred =
>>>>>>>> checkForThrowable(jnienv);
>>>>>>>> 1310 jplis_assert(!errorOccurred);
>>>>>>>> 1311 if (errorOccurred) {
>>>>>>>> 1312 break;
>>>>>>>> 1313 }
>>>>>>>> 1314 }
>>>>>>>>
>>>>>>>> I'm going to delete lines 1311-1313 so we'll just try to keep
>>>>>>>> freeing as many of the memory arrays as we can...
>>>>>>> Thanks - I prefer that solution.
>>>>>>
>>>>>> I figured you might...
>>>>>>
>>>>>>
>>>>>>>> Fixed in all three versions.
>>>>>>>>
>>>>>>>> On a related note, jplis_assert() appears to be enabled even
>>>>>>>> in product bits. Which means if one of the many jplis_assert()
>>>>>>>> calls fails, then the agent terminates. I don't know the history
>>>>>>>> behind it being enabled in all bits, but I figure that's a
>>>>>>>> different issue for the Serviceability team to mull on...
>>>>>>> I wondered about that, but it seemed consistent with existing
>>>>>>> usage - so I agree.
>>>>>>
>>>>>> Glad we're on the same page!
>>>>>>
>>>>>> Dan
>>>>>>
>>>>>>
>>>>>>>> Thanks again for the review.
>>>>>>>>
>>>>>>>> Dan
>>>>>>> thanks,
>>>>>>> Karen
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> thanks,
>>>>>>>>> Karen
>>>>>>>>>
>>>>>>>>> On Dec 21, 2011, at 2:09 PM, Daniel D. Daugherty wrote:
>>>>>>>>>
>>>>>>>>>> Greetings,
>>>>>>>>>>
>>>>>>>>>> This is a code review request for "day one" memory leaks in
>>>>>>>>>> the java.lang.instrument.Instrumentation.redefineClasses()
>>>>>>>>>> and JVM/TI RetransformClasses() APIs.
>>>>>>>>>>
>>>>>>>>>> Since one leak is in the JDK and the other leak is in the
>>>>>>>>>> VM, I'm sending out separate webrevs for each repo. I'm also
>>>>>>>>>> attacking these leaks in three releases in parallel so there
>>>>>>>>>> is a pair of webrevs for: JDK6u29, JDK7u4 and JDK8. Yes, I'm
>>>>>>>>>> trying to get this all done before Christmas!
>>>>>>>>>>
>>>>>>>>>> Here are the bug links:
>>>>>>>>>>
>>>>>>>>>> 7121600 2/3 Instrumentation.redefineClasses() leaks class bytes
>>>>>>>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7121600
>>>>>>>>>> http://monaco.sfbay.sun.com/detail.jsp?cr=7121600
>>>>>>>>>>
>>>>>>>>>> 7122253 2/3 Instrumentation.retransformClasses() leaks class
>>>>>>>>>> bytes
>>>>>>>>>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7121600
>>>>>>>>>> http://monaco.sfbay.sun.com/detail.jsp?cr=7122253
>>>>>>>>>>
>>>>>>>>>> I don't know why the bugs.sun.com links aren't showing up yet...
>>>>>>>>>>
>>>>>>>>>> I think it is best to review the JDK7u4/HSX-23-B06 webrevs first.
>>>>>>>>>>
>>>>>>>>>> Here are the webrevs for the JDK6u29/HSX-20 version of the fixes:
>>>>>>>>>>
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7121600-webrev/1-jdk6u29/
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7122253-webrev/0-hsx20/
>>>>>>>>>>
>>>>>>>>>> I expect the OpenJDK6 version of the fixes to very similar if not
>>>>>>>>>> identical to the JDK6u29 version. I haven't been tracking the
>>>>>>>>>> OpenJDK6 project as closely as I used to so I don't know whether
>>>>>>>>>> these fixes should go back there also.
>>>>>>>>>>
>>>>>>>>>> Here are the webrevs for the JDK7u4/HSX-23-B06 version of the fixes:
>>>>>>>>>>
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7121600-webrev/1-jdk7u4/
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7122253-webrev/0-hsx23-b06/
>>>>>>>>>>
>>>>>>>>>> The JDK7u4 JLI code has some other, unrelated fixes relative to
>>>>>>>>>> the JDK6u29 JLI code. That required a very minor change in my fix
>>>>>>>>>> to JPLISAgent.c to insulate against unexpected JVM/TI phase values
>>>>>>>>>> in a slightly different way than the original JDK7u4 code.
>>>>>>>>>>
>>>>>>>>>> Also, JDK7u4 was updated to the HSX-23-B08 snapshot last night, but
>>>>>>>>>> I baselined and tested the fix against HSX-23-B06 so I'm sending out
>>>>>>>>>> the webrev for what I actually used.
>>>>>>>>>>
>>>>>>>>>> Here are the webrevs for the JDK8/HSX-23-B08 version of the fixes:
>>>>>>>>>>
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7121600-webrev/1-jdk8/
>>>>>>>>>> http://cr.openjdk.java.net/~dcubed/7122253-webrev/0-hsx23-b08/
>>>>>>>>>>
>>>>>>>>>> The JDK7u4 and JDK8 versions of the fix for 7121600 are identical.
>>>>>>>>>> The HSX-23-B06 and HSX-23-B08 versions of the fix for 7122253 are
>>>>>>>>>> also identical.
>>>>>>>>>>
>>>>>>>>>> I've run the following test suites:
>>>>>>>>>>
>>>>>>>>>> - VM/NSK jvmti, VM/NSK jvmti_unit
>>>>>>>>>> - VM/NSK jdwp
>>>>>>>>>> - SDK/JDK com/sun/jdi, SDK/JDK closed/com/sun/jdi, VM/NSK jdi
>>>>>>>>>> - SDK/JDK java/lang/instrument
>>>>>>>>>> - VM/NSK hprof, VM/NSK jdb, VM/NSK sajdi
>>>>>>>>>> - VM/NSK heapdump
>>>>>>>>>> - SDK/JDK misc_attach, SDK/JDK misc_jvmstat, SDK/JDK misc_tools
>>>>>>>>>>
>>>>>>>>>> on the following configs:
>>>>>>>>>>
>>>>>>>>>> - {Client VM, Server VM} x {product, fastdebug} x {-Xmixed, -Xcomp}
>>>>>>>>>> - Solaris X86 JDK6u29/HSX-20 (done - no regressions)
>>>>>>>>>> - Solaris X86 JDK7u4/HSX-23-B06 (done - no regressions)
>>>>>>>>>> - WinXP JDK7u4/HSX-23-B06 (in process, no regressions so far)
>>>>>>>>>> - Solaris X86 JDK8/HSX-23-B08 (just started)
>>>>>>>>>> - WinXP JDK8/HSX-23-B08 (not yet started)
>>>>>>>>>>
>>>>>>>>>> Thanks, in advance, for any feedback...
>>>>>>>>>>
>>>>>>>>>> Dan
>>>>>>>>>>
>>>>>>>>>>