1.1 --- a/src/share/vm/prims/jvmtiImpl.cpp Tue Mar 15 06:35:10 2011 -0700 1.2 +++ b/src/share/vm/prims/jvmtiImpl.cpp Tue Mar 15 06:37:31 2011 -0700 1.3 @@ -919,15 +919,24 @@ 1.4 nmethod* nm) { 1.5 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_LOAD); 1.6 event._event_data.compiled_method_load = nm; 1.7 - nmethodLocker::lock_nmethod(nm); // will be unlocked when posted 1.8 + // Keep the nmethod alive until the ServiceThread can process 1.9 + // this deferred event. 1.10 + nmethodLocker::lock_nmethod(nm); 1.11 return event; 1.12 } 1.13 1.14 JvmtiDeferredEvent JvmtiDeferredEvent::compiled_method_unload_event( 1.15 - jmethodID id, const void* code) { 1.16 + nmethod* nm, jmethodID id, const void* code) { 1.17 JvmtiDeferredEvent event = JvmtiDeferredEvent(TYPE_COMPILED_METHOD_UNLOAD); 1.18 + event._event_data.compiled_method_unload.nm = nm; 1.19 event._event_data.compiled_method_unload.method_id = id; 1.20 event._event_data.compiled_method_unload.code_begin = code; 1.21 + // Keep the nmethod alive until the ServiceThread can process 1.22 + // this deferred event. This will keep the memory for the 1.23 + // generated code from being reused too early. We pass 1.24 + // zombie_ok == true here so that our nmethod that was just 1.25 + // made into a zombie can be locked. 1.26 + nmethodLocker::lock_nmethod(nm, true /* zombie_ok */); 1.27 return event; 1.28 } 1.29 JvmtiDeferredEvent JvmtiDeferredEvent::dynamic_code_generated_event( 1.30 @@ -946,14 +955,19 @@ 1.31 case TYPE_COMPILED_METHOD_LOAD: { 1.32 nmethod* nm = _event_data.compiled_method_load; 1.33 JvmtiExport::post_compiled_method_load(nm); 1.34 + // done with the deferred event so unlock the nmethod 1.35 nmethodLocker::unlock_nmethod(nm); 1.36 break; 1.37 } 1.38 - case TYPE_COMPILED_METHOD_UNLOAD: 1.39 + case TYPE_COMPILED_METHOD_UNLOAD: { 1.40 + nmethod* nm = _event_data.compiled_method_unload.nm; 1.41 JvmtiExport::post_compiled_method_unload( 1.42 _event_data.compiled_method_unload.method_id, 1.43 _event_data.compiled_method_unload.code_begin); 1.44 + // done with the deferred event so unlock the nmethod 1.45 + nmethodLocker::unlock_nmethod(nm); 1.46 break; 1.47 + } 1.48 case TYPE_DYNAMIC_CODE_GENERATED: 1.49 JvmtiExport::post_dynamic_code_generated_internal( 1.50 _event_data.dynamic_code_generated.name,