Mon, 14 Mar 2016 12:35:48 +0300
8141420: Compiler runtime entries don't hold Klass* from being GCed
Reviewed-by: kvn, coleenp
src/share/vm/c1/c1_Runtime1.cpp | file | annotate | diff | comparison | revisions | |
src/share/vm/opto/runtime.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/c1/c1_Runtime1.cpp Fri Apr 15 14:47:04 2016 +0100 1.2 +++ b/src/share/vm/c1/c1_Runtime1.cpp Mon Mar 14 12:35:48 2016 +0300 1.3 @@ -312,6 +312,7 @@ 1.4 NOT_PRODUCT(_new_instance_slowcase_cnt++;) 1.5 1.6 assert(klass->is_klass(), "not a class"); 1.7 + Handle holder(THREAD, klass->klass_holder()); // keep the klass alive 1.8 instanceKlassHandle h(thread, klass); 1.9 h->check_valid_for_instantiation(true, CHECK); 1.10 // make sure klass is initialized 1.11 @@ -347,6 +348,7 @@ 1.12 // anymore after new_objArray() and no GC can happen before. 1.13 // (This may have to change if this code changes!) 1.14 assert(array_klass->is_klass(), "not a class"); 1.15 + Handle holder(THREAD, array_klass->klass_holder()); // keep the klass alive 1.16 Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass(); 1.17 objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK); 1.18 thread->set_vm_result(obj); 1.19 @@ -363,6 +365,7 @@ 1.20 1.21 assert(klass->is_klass(), "not a class"); 1.22 assert(rank >= 1, "rank must be nonzero"); 1.23 + Handle holder(THREAD, klass->klass_holder()); // keep the klass alive 1.24 oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK); 1.25 thread->set_vm_result(obj); 1.26 JRT_END
2.1 --- a/src/share/vm/opto/runtime.cpp Fri Apr 15 14:47:04 2016 +0100 2.2 +++ b/src/share/vm/opto/runtime.cpp Mon Mar 14 12:35:48 2016 +0300 2.3 @@ -231,22 +231,17 @@ 2.4 2.5 // These checks are cheap to make and support reflective allocation. 2.6 int lh = klass->layout_helper(); 2.7 - if (Klass::layout_helper_needs_slow_path(lh) 2.8 - || !InstanceKlass::cast(klass)->is_initialized()) { 2.9 - KlassHandle kh(THREAD, klass); 2.10 - kh->check_valid_for_instantiation(false, THREAD); 2.11 + if (Klass::layout_helper_needs_slow_path(lh) || !InstanceKlass::cast(klass)->is_initialized()) { 2.12 + Handle holder(THREAD, klass->klass_holder()); // keep the klass alive 2.13 + klass->check_valid_for_instantiation(false, THREAD); 2.14 if (!HAS_PENDING_EXCEPTION) { 2.15 - InstanceKlass::cast(kh())->initialize(THREAD); 2.16 - } 2.17 - if (!HAS_PENDING_EXCEPTION) { 2.18 - klass = kh(); 2.19 - } else { 2.20 - klass = NULL; 2.21 + InstanceKlass::cast(klass)->initialize(THREAD); 2.22 } 2.23 } 2.24 2.25 - if (klass != NULL) { 2.26 + if (!HAS_PENDING_EXCEPTION) { 2.27 // Scavenge and allocate an instance. 2.28 + Handle holder(THREAD, klass->klass_holder()); // keep the klass alive 2.29 oop result = InstanceKlass::cast(klass)->allocate_instance(THREAD); 2.30 thread->set_vm_result(result); 2.31 2.32 @@ -286,6 +281,7 @@ 2.33 // Although the oopFactory likes to work with the elem_type, 2.34 // the compiler prefers the array_type, since it must already have 2.35 // that latter value in hand for the fast path. 2.36 + Handle holder(THREAD, array_type->klass_holder()); // keep the array klass alive 2.37 Klass* elem_type = ObjArrayKlass::cast(array_type)->element_klass(); 2.38 result = oopFactory::new_objArray(elem_type, len, THREAD); 2.39 } 2.40 @@ -364,6 +360,7 @@ 2.41 jint dims[2]; 2.42 dims[0] = len1; 2.43 dims[1] = len2; 2.44 + Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive 2.45 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(2, dims, THREAD); 2.46 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); 2.47 thread->set_vm_result(obj); 2.48 @@ -380,6 +377,7 @@ 2.49 dims[0] = len1; 2.50 dims[1] = len2; 2.51 dims[2] = len3; 2.52 + Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive 2.53 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(3, dims, THREAD); 2.54 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); 2.55 thread->set_vm_result(obj); 2.56 @@ -397,6 +395,7 @@ 2.57 dims[1] = len2; 2.58 dims[2] = len3; 2.59 dims[3] = len4; 2.60 + Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive 2.61 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(4, dims, THREAD); 2.62 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); 2.63 thread->set_vm_result(obj); 2.64 @@ -415,6 +414,7 @@ 2.65 dims[2] = len3; 2.66 dims[3] = len4; 2.67 dims[4] = len5; 2.68 + Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive 2.69 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(5, dims, THREAD); 2.70 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); 2.71 thread->set_vm_result(obj); 2.72 @@ -432,6 +432,7 @@ 2.73 jint *c_dims = NEW_RESOURCE_ARRAY(jint, len); 2.74 Copy::conjoint_jints_atomic(j_dims, c_dims, len); 2.75 2.76 + Handle holder(THREAD, elem_type->klass_holder()); // keep the klass alive 2.77 oop obj = ArrayKlass::cast(elem_type)->multi_allocate(len, c_dims, THREAD); 2.78 deoptimize_caller_frame(thread, HAS_PENDING_EXCEPTION); 2.79 thread->set_vm_result(obj);