Thu, 11 Aug 2011 11:36:29 -0700
7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App
Summary: Handlize MemoryUsage klass oop in createGCInfo routine
Reviewed-by: tonyp, fparain, ysr, jcoomes
src/share/vm/services/gcNotifier.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/services/gcNotifier.cpp Thu Aug 11 14:58:29 2011 +0100 1.2 +++ b/src/share/vm/services/gcNotifier.cpp Thu Aug 11 11:36:29 2011 -0700 1.3 @@ -92,7 +92,6 @@ 1.4 &args, 1.5 CHECK_NH); 1.6 return Handle(THREAD,(oop)result.get_jobject()); 1.7 - 1.8 } 1.9 1.10 static Handle createGcInfo(GCMemoryManager *gcManager, GCStatInfo *gcStatInfo,TRAPS) { 1.11 @@ -100,9 +99,16 @@ 1.12 // Fill the arrays of MemoryUsage objects with before and after GC 1.13 // per pool memory usage 1.14 1.15 - klassOop muKlass = Management::java_lang_management_MemoryUsage_klass(CHECK_NH); objArrayOop bu = oopFactory::new_objArray( muKlass,MemoryService::num_memory_pools(), CHECK_NH); 1.16 + klassOop mu_klass = Management::java_lang_management_MemoryUsage_klass(CHECK_NH); 1.17 + instanceKlassHandle mu_kh(THREAD, mu_klass); 1.18 + 1.19 + // The array allocations below should use a handle containing mu_klass 1.20 + // as the first allocation could trigger a GC, causing the actual 1.21 + // klass oop to move, and leaving mu_klass pointing to the old 1.22 + // location. 1.23 + objArrayOop bu = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH); 1.24 objArrayHandle usage_before_gc_ah(THREAD, bu); 1.25 - objArrayOop au = oopFactory::new_objArray(muKlass,MemoryService::num_memory_pools(), CHECK_NH); 1.26 + objArrayOop au = oopFactory::new_objArray(mu_kh(), MemoryService::num_memory_pools(), CHECK_NH); 1.27 objArrayHandle usage_after_gc_ah(THREAD, au); 1.28 1.29 for (int i = 0; i < MemoryService::num_memory_pools(); i++) { 1.30 @@ -126,7 +132,7 @@ 1.31 // The type is 'I' 1.32 objArrayOop extra_args_array = oopFactory::new_objArray(SystemDictionary::Integer_klass(), 1, CHECK_NH); 1.33 objArrayHandle extra_array (THREAD, extra_args_array); 1.34 - klassOop itKlass= SystemDictionary::Integer_klass(); 1.35 + klassOop itKlass = SystemDictionary::Integer_klass(); 1.36 instanceKlassHandle intK(THREAD, itKlass); 1.37 1.38 instanceHandle extra_arg_val = intK->allocate_instance_handle(CHECK_NH); 1.39 @@ -147,7 +153,7 @@ 1.40 extra_array->obj_at_put(0,extra_arg_val()); 1.41 1.42 klassOop gcInfoklass = Management::com_sun_management_GcInfo_klass(CHECK_NH); 1.43 - instanceKlassHandle ik (THREAD,gcInfoklass); 1.44 + instanceKlassHandle ik(THREAD, gcInfoklass); 1.45 1.46 Handle gcInfo_instance = ik->allocate_instance_handle(CHECK_NH); 1.47