annotate src/share/vm/services/lowMemoryDetector.hpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
2 * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // Low Memory Detection Support
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // Two memory alarms in the JDK (we called them sensors).
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // - Heap memory sensor
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // - Non-heap memory sensor
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // When the VM detects if the memory usage of a memory pool has reached
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // or exceeded its threshold, it will trigger the sensor for the type
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // of the memory pool (heap or nonheap or both).
a61af66fc99e Initial load
duke
parents:
diff changeset
32 //
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // If threshold == -1, no low memory detection is supported and
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // the threshold value is not allowed to be changed.
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // If threshold == 0, no low memory detection is performed for
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // that memory pool. The threshold can be set to any non-negative
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // value.
a61af66fc99e Initial load
duke
parents:
diff changeset
38 //
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // The default threshold of the Hotspot memory pools are:
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Eden space -1
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // Survivor space 1 -1
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Survivor space 2 -1
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Old generation 0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Perm generation 0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // CodeCache 0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // For heap memory, detection will be performed when GC finishes
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // and also in the slow path allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // For Code cache, detection will be performed in the allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // and deallocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // May need to deal with hysteresis effect.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 //
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class LowMemoryDetectorThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 class OopClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class MemoryPool;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 class ThresholdSupport : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
60 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
61 bool _support_high_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 bool _support_low_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 size_t _high_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 size_t _low_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
66 ThresholdSupport(bool support_high, bool support_low) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 _support_high_threshold = support_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 _support_low_threshold = support_low;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 _high_threshold = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _low_threshold= 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 size_t high_threshold() const { return _high_threshold; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 size_t low_threshold() const { return _low_threshold; }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 bool is_high_threshold_supported() { return _support_high_threshold; }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 bool is_low_threshold_supported() { return _support_low_threshold; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 bool is_high_threshold_crossed(MemoryUsage usage) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 if (_support_high_threshold && _high_threshold > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 return (usage.used() >= _high_threshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 }
a61af66fc99e Initial load
duke
parents:
diff changeset
84 bool is_low_threshold_crossed(MemoryUsage usage) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 if (_support_low_threshold && _low_threshold > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return (usage.used() < _low_threshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 size_t set_high_threshold(size_t new_threshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 assert(_support_high_threshold, "can only be set if supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
93 assert(new_threshold >= _low_threshold, "new_threshold must be >= _low_threshold");
a61af66fc99e Initial load
duke
parents:
diff changeset
94 size_t prev = _high_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 _high_threshold = new_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 return prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 size_t set_low_threshold(size_t new_threshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 assert(_support_low_threshold, "can only be set if supported");
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert(new_threshold <= _high_threshold, "new_threshold must be <= _high_threshold");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 size_t prev = _low_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _low_threshold = new_threshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 return prev;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 };
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 class SensorInfo : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
110 instanceOop _sensor_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 bool _sensor_on;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 size_t _sensor_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // before the actual sensor on flag and sensor count are set
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // we maintain the number of pending triggers and clears.
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // _pending_trigger_count means the number of pending triggers
a61af66fc99e Initial load
duke
parents:
diff changeset
117 // and the sensor count should be incremented by the same number.
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 int _pending_trigger_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 // _pending_clear_count takes precedence if it's > 0 which
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // indicates the resulting sensor will be off
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Sensor trigger requests will reset this clear count to
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // indicate the resulting flag should be on.
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int _pending_clear_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 MemoryUsage _usage;
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void clear(int count, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void trigger(int count, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
133 SensorInfo();
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void set_sensor(instanceOop sensor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 assert(_sensor_obj == NULL, "Should be set only once");
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _sensor_obj = sensor;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 bool has_pending_requests() {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 return (_pending_trigger_count > 0 || _pending_clear_count > 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int pending_trigger_count() { return _pending_trigger_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 int pending_clear_count() { return _pending_clear_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // When this method is used, the memory usage is monitored
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // as a gauge attribute. High and low thresholds are designed
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // to provide a hysteresis mechanism to avoid repeated triggering
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // of notifications when the attribute value makes small oscillations
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // around the high or low threshold value.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 //
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // The sensor will be triggered if:
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // (1) the usage is crossing above the high threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // the sensor is currently off and no pending
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // trigger requests; or
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // (2) the usage is crossing above the high threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // the sensor will be off (i.e. sensor is currently on
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // and has pending clear requests).
a61af66fc99e Initial load
duke
parents:
diff changeset
159 //
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Subsequent crossings of the high threshold value do not cause
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // any triggers unless the usage becomes less than the low threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 //
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // The sensor will be cleared if:
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // (1) the usage is crossing below the low threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // the sensor is currently on and no pending
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // clear requests; or
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // (2) the usage is crossing below the low threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // the sensor will be on (i.e. sensor is currently off
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // and has pending trigger requests).
a61af66fc99e Initial load
duke
parents:
diff changeset
170 //
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Subsequent crossings of the low threshold value do not cause
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // any clears unless the usage becomes greater than or equal
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // to the high threshold.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 //
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // If the current level is between high and low threhsold, no change.
a61af66fc99e Initial load
duke
parents:
diff changeset
176 //
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void set_gauge_sensor_level(MemoryUsage usage, ThresholdSupport* high_low_threshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // When this method is used, the memory usage is monitored as a
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // simple counter attribute. The sensor will be triggered
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // whenever the usage is crossing the threshold to keep track
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // of the number of times the VM detects such a condition occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
183 //
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // The sensor will be triggered if:
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // - the usage is crossing above the high threshold regardless
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // of the current sensor state.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 //
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // The sensor will be cleared if:
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // (1) the usage is crossing below the low threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // the sensor is currently on; or
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // (2) the usage is crossing below the low threshold and
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // the sensor will be on (i.e. sensor is currently off
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // and has pending trigger requests).
a61af66fc99e Initial load
duke
parents:
diff changeset
194 //
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void set_counter_sensor_level(MemoryUsage usage, ThresholdSupport* counter_threshold);
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void process_pending_requests(TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // printing on default output stream;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
203 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
204 };
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 class LowMemoryDetector : public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 friend class LowMemoryDetectorDisabler;
a61af66fc99e Initial load
duke
parents:
diff changeset
208 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // true if any collected heap has low memory detection enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
210 static volatile bool _enabled_for_collected_pools;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // > 0 if temporary disabed
a61af66fc99e Initial load
duke
parents:
diff changeset
212 static volatile jint _disabled_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 static LowMemoryDetectorThread* _detector_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 static void low_memory_detector_thread_entry(JavaThread* thread, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 static void check_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 static bool has_pending_requests();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 static bool temporary_disabled() { return _disabled_count > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 static void disable() { Atomic::inc(&_disabled_count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 static void enable() { Atomic::dec(&_disabled_count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
223 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
224 static void detect_low_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
225 static void detect_low_memory(MemoryPool* pool);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 static void detect_after_gc_memory(MemoryPool* pool);
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 static bool is_enabled(MemoryPool* pool) {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // low memory detection is enabled for collected memory pools
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // iff one of the collected memory pool has a sensor and the
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // threshold set non-zero
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (pool->usage_sensor() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
234 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 ThresholdSupport* threshold_support = pool->usage_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
236 return (threshold_support->is_high_threshold_supported() ?
a61af66fc99e Initial load
duke
parents:
diff changeset
237 (threshold_support->high_threshold() > 0) : false);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // indicates if low memory detection is enabled for any collected
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // memory pools
a61af66fc99e Initial load
duke
parents:
diff changeset
243 static inline bool is_enabled_for_collected_pools() {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return !temporary_disabled() && _enabled_for_collected_pools;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // recompute enabled flag
a61af66fc99e Initial load
duke
parents:
diff changeset
248 static void recompute_enabled_for_collected_pools();
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // low memory detection for collected memory pools.
a61af66fc99e Initial load
duke
parents:
diff changeset
251 static inline void detect_low_memory_for_collected_pools() {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // no-op if low memory detection not enabled
a61af66fc99e Initial load
duke
parents:
diff changeset
253 if (!is_enabled_for_collected_pools()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int num_memory_pools = MemoryService::num_memory_pools();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 for (int i=0; i<num_memory_pools; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 MemoryPool* pool = MemoryService::get_memory_pool(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // if low memory detection is enabled then check if the
a61af66fc99e Initial load
duke
parents:
diff changeset
261 // current used exceeds the high threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (pool->is_collected_pool() && is_enabled(pool)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 size_t used = pool->used_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 size_t high = pool->usage_threshold()->high_threshold();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 if (used > high) {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 detect_low_memory(pool);
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 };
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 class LowMemoryDetectorDisabler: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
276 LowMemoryDetectorDisabler()
a61af66fc99e Initial load
duke
parents:
diff changeset
277 {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 LowMemoryDetector::disable();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 ~LowMemoryDetectorDisabler()
a61af66fc99e Initial load
duke
parents:
diff changeset
281 {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 assert(LowMemoryDetector::temporary_disabled(), "should be disabled!");
a61af66fc99e Initial load
duke
parents:
diff changeset
283 LowMemoryDetector::enable();
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 };