// This method could be called from any Java threads // and also VMThread. void LowMemoryDetector::detect_low_memory() { MutexLockerEx ml(Service_lock, Mutex::_no_safepoint_check_flag); bool has_pending_requests = false; int num_memory_pools = MemoryService::num_memory_pools(); for (int i = 0; i < num_memory_pools; i++) { MemoryPool* pool = MemoryService::get_memory_pool(i); SensorInfo* sensor = pool->usage_sensor(); if (sensor != NULL && pool->usage_threshold()->is_high_threshold_supported() && pool->usage_threshold()->high_threshold() != 0) { MemoryUsage usage = pool->get_memory_usage(); sensor->set_gauge_sensor_level(usage, pool->usage_threshold()); has_pending_requests = has_pending_requests || sensor->has_pending_requests(); } } if (has_pending_requests) { Service_lock->notify_all(); } }
// low memory detection for collected memory pools. static inline void detect_low_memory_for_collected_pools() { // no-op if low memory detection not enabled if (!is_enabled_for_collected_pools()) { return; } int num_memory_pools = MemoryService::num_memory_pools(); for (int i=0; i<num_memory_pools; i++) { MemoryPool* pool = MemoryService::get_memory_pool(i); // if low memory detection is enabled then check if the // current used exceeds the high threshold if (pool->is_collected_pool() && is_enabled(pool)) { size_t used = pool->used_in_bytes(); size_t high = pool->usage_threshold()->high_threshold(); if (used > high) { detect_low_memory(pool); } } } }