7074579: G1: JVM crash with JDK7 running ATG CRMDemo Fusion App

Thu, 11 Aug 2011 11:36:29 -0700

author
johnc
date
Thu, 11 Aug 2011 11:36:29 -0700
changeset 3027
87e40b34bc2b
parent 3026
e9db47a083cc
child 3028
f44782f04dd4

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  

mercurial