32 #include "interpreter/interpreter.hpp" |
32 #include "interpreter/interpreter.hpp" |
33 #include "interpreter/oopMapCache.hpp" |
33 #include "interpreter/oopMapCache.hpp" |
34 #include "memory/allocation.inline.hpp" |
34 #include "memory/allocation.inline.hpp" |
35 #include "memory/oopFactory.hpp" |
35 #include "memory/oopFactory.hpp" |
36 #include "memory/resourceArea.hpp" |
36 #include "memory/resourceArea.hpp" |
37 #include "oops/methodOop.hpp" |
37 #include "oops/method.hpp" |
38 #include "oops/oop.inline.hpp" |
38 #include "oops/oop.inline.hpp" |
39 #include "prims/jvmtiThreadState.hpp" |
39 #include "prims/jvmtiThreadState.hpp" |
40 #include "runtime/biasedLocking.hpp" |
40 #include "runtime/biasedLocking.hpp" |
41 #include "runtime/compilationPolicy.hpp" |
41 #include "runtime/compilationPolicy.hpp" |
42 #include "runtime/deoptimization.hpp" |
42 #include "runtime/deoptimization.hpp" |
746 |
746 |
747 for (int i = 0; i < objects->length(); i++) { |
747 for (int i = 0; i < objects->length(); i++) { |
748 assert(objects->at(i)->is_object(), "invalid debug information"); |
748 assert(objects->at(i)->is_object(), "invalid debug information"); |
749 ObjectValue* sv = (ObjectValue*) objects->at(i); |
749 ObjectValue* sv = (ObjectValue*) objects->at(i); |
750 |
750 |
751 KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()()); |
751 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
752 oop obj = NULL; |
752 oop obj = NULL; |
753 |
753 |
754 if (k->oop_is_instance()) { |
754 if (k->oop_is_instance()) { |
755 instanceKlass* ik = instanceKlass::cast(k()); |
755 InstanceKlass* ik = InstanceKlass::cast(k()); |
756 obj = ik->allocate_instance(CHECK_(false)); |
756 obj = ik->allocate_instance(CHECK_(false)); |
757 } else if (k->oop_is_typeArray()) { |
757 } else if (k->oop_is_typeArray()) { |
758 typeArrayKlass* ak = typeArrayKlass::cast(k()); |
758 typeArrayKlass* ak = typeArrayKlass::cast(k()); |
759 assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length"); |
759 assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length"); |
760 int len = sv->field_size() / type2size[ak->element_type()]; |
760 int len = sv->field_size() / type2size[ak->element_type()]; |
780 // they are yielded by do_nonstatic_fields. |
780 // they are yielded by do_nonstatic_fields. |
781 class FieldReassigner: public FieldClosure { |
781 class FieldReassigner: public FieldClosure { |
782 frame* _fr; |
782 frame* _fr; |
783 RegisterMap* _reg_map; |
783 RegisterMap* _reg_map; |
784 ObjectValue* _sv; |
784 ObjectValue* _sv; |
785 instanceKlass* _ik; |
785 InstanceKlass* _ik; |
786 oop _obj; |
786 oop _obj; |
787 |
787 |
788 int _i; |
788 int _i; |
789 public: |
789 public: |
790 FieldReassigner(frame* fr, RegisterMap* reg_map, ObjectValue* sv, oop obj) : |
790 FieldReassigner(frame* fr, RegisterMap* reg_map, ObjectValue* sv, oop obj) : |
912 |
912 |
913 // restore fields of all eliminated objects and arrays |
913 // restore fields of all eliminated objects and arrays |
914 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects) { |
914 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects) { |
915 for (int i = 0; i < objects->length(); i++) { |
915 for (int i = 0; i < objects->length(); i++) { |
916 ObjectValue* sv = (ObjectValue*) objects->at(i); |
916 ObjectValue* sv = (ObjectValue*) objects->at(i); |
917 KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()()); |
917 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
918 Handle obj = sv->value(); |
918 Handle obj = sv->value(); |
919 assert(obj.not_null(), "reallocation was missed"); |
919 assert(obj.not_null(), "reallocation was missed"); |
920 |
920 |
921 if (k->oop_is_instance()) { |
921 if (k->oop_is_instance()) { |
922 instanceKlass* ik = instanceKlass::cast(k()); |
922 InstanceKlass* ik = InstanceKlass::cast(k()); |
923 FieldReassigner reassign(fr, reg_map, sv, obj()); |
923 FieldReassigner reassign(fr, reg_map, sv, obj()); |
924 ik->do_nonstatic_fields(&reassign); |
924 ik->do_nonstatic_fields(&reassign); |
925 } else if (k->oop_is_typeArray()) { |
925 } else if (k->oop_is_typeArray()) { |
926 typeArrayKlass* ak = typeArrayKlass::cast(k()); |
926 typeArrayKlass* ak = typeArrayKlass::cast(k()); |
927 reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type()); |
927 reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type()); |
963 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects) { |
963 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects) { |
964 fieldDescriptor fd; |
964 fieldDescriptor fd; |
965 |
965 |
966 for (int i = 0; i < objects->length(); i++) { |
966 for (int i = 0; i < objects->length(); i++) { |
967 ObjectValue* sv = (ObjectValue*) objects->at(i); |
967 ObjectValue* sv = (ObjectValue*) objects->at(i); |
968 KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()()); |
968 KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); |
969 Handle obj = sv->value(); |
969 Handle obj = sv->value(); |
970 |
970 |
971 tty->print(" object <" INTPTR_FORMAT "> of type ", sv->value()()); |
971 tty->print(" object <" INTPTR_FORMAT "> of type ", sv->value()()); |
972 k->as_klassOop()->print_value(); |
972 k->print_value(); |
973 tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize); |
973 tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize); |
974 tty->cr(); |
974 tty->cr(); |
975 |
975 |
976 if (Verbose) { |
976 if (Verbose) { |
977 k->oop_print_on(obj(), tty); |
977 k->oop_print_on(obj(), tty); |
1180 |
1180 |
1181 #if defined(COMPILER2) || defined(SHARK) |
1181 #if defined(COMPILER2) || defined(SHARK) |
1182 void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS) { |
1182 void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS) { |
1183 // in case of an unresolved klass entry, load the class. |
1183 // in case of an unresolved klass entry, load the class. |
1184 if (constant_pool->tag_at(index).is_unresolved_klass()) { |
1184 if (constant_pool->tag_at(index).is_unresolved_klass()) { |
1185 klassOop tk = constant_pool->klass_at(index, CHECK); |
1185 Klass* tk = constant_pool->klass_at(index, CHECK); |
1186 return; |
1186 return; |
1187 } |
1187 } |
1188 |
1188 |
1189 if (!constant_pool->tag_at(index).is_symbol()) return; |
1189 if (!constant_pool->tag_at(index).is_symbol()) return; |
1190 |
1190 |
1191 Handle class_loader (THREAD, instanceKlass::cast(constant_pool->pool_holder())->class_loader()); |
1191 Handle class_loader (THREAD, InstanceKlass::cast(constant_pool->pool_holder())->class_loader()); |
1192 Symbol* symbol = constant_pool->symbol_at(index); |
1192 Symbol* symbol = constant_pool->symbol_at(index); |
1193 |
1193 |
1194 // class name? |
1194 // class name? |
1195 if (symbol->byte_at(0) != '(') { |
1195 if (symbol->byte_at(0) != '(') { |
1196 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); |
1196 Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); |
1266 gather_statistics(reason, action, trap_bc); |
1266 gather_statistics(reason, action, trap_bc); |
1267 |
1267 |
1268 // Ensure that we can record deopt. history: |
1268 // Ensure that we can record deopt. history: |
1269 bool create_if_missing = ProfileTraps; |
1269 bool create_if_missing = ProfileTraps; |
1270 |
1270 |
1271 methodDataHandle trap_mdo |
1271 MethodData* trap_mdo = |
1272 (THREAD, get_method_data(thread, trap_method, create_if_missing)); |
1272 get_method_data(thread, trap_method, create_if_missing); |
1273 |
1273 |
1274 // Print a bunch of diagnostics, if requested. |
1274 // Print a bunch of diagnostics, if requested. |
1275 if (TraceDeoptimization || LogCompilation) { |
1275 if (TraceDeoptimization || LogCompilation) { |
1276 ResourceMark rm; |
1276 ResourceMark rm; |
1277 ttyLocker ttyl; |
1277 ttyLocker ttyl; |
1295 class_name = constants->symbol_at(unloaded_class_index); |
1295 class_name = constants->symbol_at(unloaded_class_index); |
1296 } |
1296 } |
1297 if (xtty != NULL) |
1297 if (xtty != NULL) |
1298 xtty->name(class_name); |
1298 xtty->name(class_name); |
1299 } |
1299 } |
1300 if (xtty != NULL && trap_mdo.not_null()) { |
1300 if (xtty != NULL && trap_mdo != NULL) { |
1301 // Dump the relevant MDO state. |
1301 // Dump the relevant MDO state. |
1302 // This is the deopt count for the current reason, any previous |
1302 // This is the deopt count for the current reason, any previous |
1303 // reasons or recompiles seen at this point. |
1303 // reasons or recompiles seen at this point. |
1304 int dcnt = trap_mdo->trap_count(reason); |
1304 int dcnt = trap_mdo->trap_count(reason); |
1305 if (dcnt != 0) |
1305 if (dcnt != 0) |
1378 // 3. In parallel with the previous measures, if the total number of |
1378 // 3. In parallel with the previous measures, if the total number of |
1379 // recompilations of a method exceeds the much larger set limit |
1379 // recompilations of a method exceeds the much larger set limit |
1380 // PerMethodRecompilationCutoff, the method is abandoned. |
1380 // PerMethodRecompilationCutoff, the method is abandoned. |
1381 // This should only happen if the method is very large and has |
1381 // This should only happen if the method is very large and has |
1382 // many "lukewarm" deoptimizations. The code which enforces this |
1382 // many "lukewarm" deoptimizations. The code which enforces this |
1383 // limit is elsewhere (class nmethod, class methodOopDesc). |
1383 // limit is elsewhere (class nmethod, class Method). |
1384 // |
1384 // |
1385 // Note that the per-BCI 'is_recompiled' bit gives the compiler one chance |
1385 // Note that the per-BCI 'is_recompiled' bit gives the compiler one chance |
1386 // to recompile at each bytecode independently of the per-BCI cutoff. |
1386 // to recompile at each bytecode independently of the per-BCI cutoff. |
1387 // |
1387 // |
1388 // The decision to update code is up to the compiler, and is encoded |
1388 // The decision to update code is up to the compiler, and is encoded |
1447 } |
1447 } |
1448 |
1448 |
1449 // Setting +ProfileTraps fixes the following, on all platforms: |
1449 // Setting +ProfileTraps fixes the following, on all platforms: |
1450 // 4852688: ProfileInterpreter is off by default for ia64. The result is |
1450 // 4852688: ProfileInterpreter is off by default for ia64. The result is |
1451 // infinite heroic-opt-uncommon-trap/deopt/recompile cycles, since the |
1451 // infinite heroic-opt-uncommon-trap/deopt/recompile cycles, since the |
1452 // recompile relies on a methodDataOop to record heroic opt failures. |
1452 // recompile relies on a MethodData* to record heroic opt failures. |
1453 |
1453 |
1454 // Whether the interpreter is producing MDO data or not, we also need |
1454 // Whether the interpreter is producing MDO data or not, we also need |
1455 // to use the MDO to detect hot deoptimization points and control |
1455 // to use the MDO to detect hot deoptimization points and control |
1456 // aggressive optimization. |
1456 // aggressive optimization. |
1457 bool inc_recompile_count = false; |
1457 bool inc_recompile_count = false; |
1458 ProfileData* pdata = NULL; |
1458 ProfileData* pdata = NULL; |
1459 if (ProfileTraps && update_trap_state && trap_mdo.not_null()) { |
1459 if (ProfileTraps && update_trap_state && trap_mdo != NULL) { |
1460 assert(trap_mdo() == get_method_data(thread, trap_method, false), "sanity"); |
1460 assert(trap_mdo == get_method_data(thread, trap_method, false), "sanity"); |
1461 uint this_trap_count = 0; |
1461 uint this_trap_count = 0; |
1462 bool maybe_prior_trap = false; |
1462 bool maybe_prior_trap = false; |
1463 bool maybe_prior_recompile = false; |
1463 bool maybe_prior_recompile = false; |
1464 pdata = query_update_method_data(trap_mdo, trap_bci, reason, |
1464 pdata = query_update_method_data(trap_mdo, trap_bci, reason, |
1465 //outputs: |
1465 //outputs: |
1571 } // Free marked resources |
1571 } // Free marked resources |
1572 |
1572 |
1573 } |
1573 } |
1574 JRT_END |
1574 JRT_END |
1575 |
1575 |
1576 methodDataOop |
1576 MethodData* |
1577 Deoptimization::get_method_data(JavaThread* thread, methodHandle m, |
1577 Deoptimization::get_method_data(JavaThread* thread, methodHandle m, |
1578 bool create_if_missing) { |
1578 bool create_if_missing) { |
1579 Thread* THREAD = thread; |
1579 Thread* THREAD = thread; |
1580 methodDataOop mdo = m()->method_data(); |
1580 MethodData* mdo = m()->method_data(); |
1581 if (mdo == NULL && create_if_missing && !HAS_PENDING_EXCEPTION) { |
1581 if (mdo == NULL && create_if_missing && !HAS_PENDING_EXCEPTION) { |
1582 // Build an MDO. Ignore errors like OutOfMemory; |
1582 // Build an MDO. Ignore errors like OutOfMemory; |
1583 // that simply means we won't have an MDO to update. |
1583 // that simply means we won't have an MDO to update. |
1584 methodOopDesc::build_interpreter_method_data(m, THREAD); |
1584 Method::build_interpreter_method_data(m, THREAD); |
1585 if (HAS_PENDING_EXCEPTION) { |
1585 if (HAS_PENDING_EXCEPTION) { |
1586 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here"); |
1586 assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here"); |
1587 CLEAR_PENDING_EXCEPTION; |
1587 CLEAR_PENDING_EXCEPTION; |
1588 } |
1588 } |
1589 mdo = m()->method_data(); |
1589 mdo = m()->method_data(); |
1590 } |
1590 } |
1591 return mdo; |
1591 return mdo; |
1592 } |
1592 } |
1593 |
1593 |
1594 ProfileData* |
1594 ProfileData* |
1595 Deoptimization::query_update_method_data(methodDataHandle trap_mdo, |
1595 Deoptimization::query_update_method_data(MethodData* trap_mdo, |
1596 int trap_bci, |
1596 int trap_bci, |
1597 Deoptimization::DeoptReason reason, |
1597 Deoptimization::DeoptReason reason, |
1598 //outputs: |
1598 //outputs: |
1599 uint& ret_this_trap_count, |
1599 uint& ret_this_trap_count, |
1600 bool& ret_maybe_prior_trap, |
1600 bool& ret_maybe_prior_trap, |
1650 ret_maybe_prior_recompile = maybe_prior_recompile; |
1650 ret_maybe_prior_recompile = maybe_prior_recompile; |
1651 return pdata; |
1651 return pdata; |
1652 } |
1652 } |
1653 |
1653 |
1654 void |
1654 void |
1655 Deoptimization::update_method_data_from_interpreter(methodDataHandle trap_mdo, int trap_bci, int reason) { |
1655 Deoptimization::update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason) { |
1656 ResourceMark rm; |
1656 ResourceMark rm; |
1657 // Ignored outputs: |
1657 // Ignored outputs: |
1658 uint ignore_this_trap_count; |
1658 uint ignore_this_trap_count; |
1659 bool ignore_maybe_prior_trap; |
1659 bool ignore_maybe_prior_trap; |
1660 bool ignore_maybe_prior_recompile; |
1660 bool ignore_maybe_prior_recompile; |