Mercurial > hg > truffle
comparison src/share/vm/prims/unsafe.cpp @ 7185:90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
Summary: Add ClassLoaderData object for each anonymous class with metaspaces to allocate in.
Reviewed-by: twisti, jrose, stefank
author | coleenp |
---|---|
date | Thu, 29 Nov 2012 16:50:29 -0500 |
parents | 070d523b96a7 |
children | 1e41b0bc58a0 |
comparison
equal
deleted
inserted
replaced
7181:2fc0334f613a | 7185:90273fc0a981 |
---|---|
994 // various kinds of metaobjects must be introduced as constants into bytecode. | 994 // various kinds of metaobjects must be introduced as constants into bytecode. |
995 // Note the cast (Object), which tells the verifier to expect an arbitrary object, | 995 // Note the cast (Object), which tells the verifier to expect an arbitrary object, |
996 // not just a literal string. For such ldc instructions, the verifier uses the | 996 // not just a literal string. For such ldc instructions, the verifier uses the |
997 // type Object instead of String, if the loaded constant is not in fact a String. | 997 // type Object instead of String, if the loaded constant is not in fact a String. |
998 | 998 |
999 static oop | 999 static instanceKlassHandle |
1000 Unsafe_DefineAnonymousClass_impl(JNIEnv *env, | 1000 Unsafe_DefineAnonymousClass_impl(JNIEnv *env, |
1001 jclass host_class, jbyteArray data, jobjectArray cp_patches_jh, | 1001 jclass host_class, jbyteArray data, jobjectArray cp_patches_jh, |
1002 HeapWord* *temp_alloc, | 1002 HeapWord* *temp_alloc, |
1003 TRAPS) { | 1003 TRAPS) { |
1004 | 1004 |
1071 CHECK_NULL); | 1071 CHECK_NULL); |
1072 if (anonk == NULL) return NULL; | 1072 if (anonk == NULL) return NULL; |
1073 anon_klass = instanceKlassHandle(THREAD, anonk); | 1073 anon_klass = instanceKlassHandle(THREAD, anonk); |
1074 } | 1074 } |
1075 | 1075 |
1076 // let caller initialize it as needed... | 1076 return anon_klass; |
1077 | |
1078 return anon_klass->java_mirror(); | |
1079 } | 1077 } |
1080 | 1078 |
1081 UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh)) | 1079 UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh)) |
1082 { | 1080 { |
1081 instanceKlassHandle anon_klass; | |
1082 jobject res_jh = NULL; | |
1083 | |
1083 UnsafeWrapper("Unsafe_DefineAnonymousClass"); | 1084 UnsafeWrapper("Unsafe_DefineAnonymousClass"); |
1084 ResourceMark rm(THREAD); | 1085 ResourceMark rm(THREAD); |
1085 | 1086 |
1086 HeapWord* temp_alloc = NULL; | 1087 HeapWord* temp_alloc = NULL; |
1087 | 1088 |
1088 jobject res_jh = NULL; | 1089 anon_klass = Unsafe_DefineAnonymousClass_impl(env, host_class, data, |
1089 | 1090 cp_patches_jh, |
1090 { oop res_oop = Unsafe_DefineAnonymousClass_impl(env, | |
1091 host_class, data, cp_patches_jh, | |
1092 &temp_alloc, THREAD); | 1091 &temp_alloc, THREAD); |
1093 if (res_oop != NULL) | 1092 if (anon_klass() != NULL) |
1094 res_jh = JNIHandles::make_local(env, res_oop); | 1093 res_jh = JNIHandles::make_local(env, anon_klass->java_mirror()); |
1095 } | |
1096 | 1094 |
1097 // try/finally clause: | 1095 // try/finally clause: |
1098 if (temp_alloc != NULL) { | 1096 if (temp_alloc != NULL) { |
1099 FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal); | 1097 FREE_C_HEAP_ARRAY(HeapWord, temp_alloc, mtInternal); |
1100 } | 1098 } |
1099 | |
1100 // The anonymous class loader data has been artificially been kept alive to | |
1101 // this point. The mirror and any instances of this class have to keep | |
1102 // it alive afterwards. | |
1103 if (anon_klass() != NULL) { | |
1104 anon_klass->class_loader_data()->set_keep_alive(false); | |
1105 } | |
1106 | |
1107 // let caller initialize it as needed... | |
1101 | 1108 |
1102 return (jclass) res_jh; | 1109 return (jclass) res_jh; |
1103 } | 1110 } |
1104 UNSAFE_END | 1111 UNSAFE_END |
1105 | 1112 |