src/share/vm/services/lowMemoryDetector.cpp

Print this page

        

*** 294,317 **** assert(count <= _pending_trigger_count, "just checking"); if (_sensor_obj != NULL) { Klass* k = Management::sun_management_Sensor_klass(CHECK); instanceKlassHandle sensorKlass (THREAD, k); Handle sensor_h(THREAD, _sensor_obj); - Handle usage_h = MemoryService::create_MemoryUsage_obj(_usage, CHECK); JavaValue result(T_VOID); JavaCallArguments args(sensor_h); args.push_int((int) count); args.push_oop(usage_h); JavaCalls::call_virtual(&result, sensorKlass, vmSymbols::trigger_name(), ! vmSymbols::trigger_method_signature(), &args, ! CHECK); } { // Holds Service_lock and update the sensor state MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); assert(_pending_trigger_count > 0, "Must have pending trigger"); --- 294,339 ---- assert(count <= _pending_trigger_count, "just checking"); if (_sensor_obj != NULL) { Klass* k = Management::sun_management_Sensor_klass(CHECK); instanceKlassHandle sensorKlass (THREAD, k); Handle sensor_h(THREAD, _sensor_obj); + Symbol* trigger_method_signature; + JavaValue result(T_VOID); JavaCallArguments args(sensor_h); args.push_int((int) count); + + Handle usage_h = MemoryService::create_MemoryUsage_obj(_usage, THREAD); + // call Sensor::trigger(int, MemoryUsage) to send notification to listeners. + // when OOME occurs and fails to allocate MemoryUsage object, call + // Sensor::trigger(int) instead. The pending request will be processed + // but no notification will be sent. + if (HAS_PENDING_EXCEPTION) { + assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOME here"); + CLEAR_PENDING_EXCEPTION; + trigger_method_signature = vmSymbols::int_void_signature(); + } else { + trigger_method_signature = vmSymbols::trigger_method_signature(); args.push_oop(usage_h); + } JavaCalls::call_virtual(&result, sensorKlass, vmSymbols::trigger_name(), ! trigger_method_signature, &args, ! THREAD); ! ! if (HAS_PENDING_EXCEPTION) { ! // we just clear the OOM pending exception that we might have encountered ! // in Java's tiggerAction(), and continue with updating the counters since ! // the Java counters have been updated too. ! assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOME here"); ! CLEAR_PENDING_EXCEPTION; } + } { // Holds Service_lock and update the sensor state MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); assert(_pending_trigger_count > 0, "Must have pending trigger");