1 /* |
1 /* |
2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
56 // For Code cache, detection will be performed in the allocation |
56 // For Code cache, detection will be performed in the allocation |
57 // and deallocation. |
57 // and deallocation. |
58 // |
58 // |
59 // May need to deal with hysteresis effect. |
59 // May need to deal with hysteresis effect. |
60 // |
60 // |
61 |
61 // Memory detection code runs in the Service thread (serviceThread.hpp). |
62 class LowMemoryDetectorThread; |
62 |
63 class OopClosure; |
63 class OopClosure; |
64 class MemoryPool; |
64 class MemoryPool; |
65 |
65 |
66 class ThresholdSupport : public CHeapObj { |
66 class ThresholdSupport : public CHeapObj { |
67 private: |
67 private: |
209 void print(); |
209 void print(); |
210 #endif // PRODUCT |
210 #endif // PRODUCT |
211 }; |
211 }; |
212 |
212 |
213 class LowMemoryDetector : public AllStatic { |
213 class LowMemoryDetector : public AllStatic { |
214 friend class LowMemoryDetectorDisabler; |
214 friend class LowMemoryDetectorDisabler; |
|
215 friend class ServiceThread; |
215 private: |
216 private: |
216 // true if any collected heap has low memory detection enabled |
217 // true if any collected heap has low memory detection enabled |
217 static volatile bool _enabled_for_collected_pools; |
218 static volatile bool _enabled_for_collected_pools; |
218 // > 0 if temporary disabed |
219 // > 0 if temporary disabed |
219 static volatile jint _disabled_count; |
220 static volatile jint _disabled_count; |
220 |
221 |
221 static LowMemoryDetectorThread* _detector_thread; |
|
222 static void low_memory_detector_thread_entry(JavaThread* thread, TRAPS); |
|
223 static void check_memory_usage(); |
222 static void check_memory_usage(); |
224 static bool has_pending_requests(); |
223 static bool has_pending_requests(); |
225 static bool temporary_disabled() { return _disabled_count > 0; } |
224 static bool temporary_disabled() { return _disabled_count > 0; } |
226 static void disable() { Atomic::inc(&_disabled_count); } |
225 static void disable() { Atomic::inc(&_disabled_count); } |
227 static void enable() { Atomic::dec(&_disabled_count); } |
226 static void enable() { Atomic::dec(&_disabled_count); } |
|
227 static void process_sensor_changes(TRAPS); |
228 |
228 |
229 public: |
229 public: |
230 static void initialize(); |
|
231 static void detect_low_memory(); |
230 static void detect_low_memory(); |
232 static void detect_low_memory(MemoryPool* pool); |
231 static void detect_low_memory(MemoryPool* pool); |
233 static void detect_after_gc_memory(MemoryPool* pool); |
232 static void detect_after_gc_memory(MemoryPool* pool); |
234 |
233 |
235 static bool is_enabled(MemoryPool* pool) { |
234 static bool is_enabled(MemoryPool* pool) { |