1 /* |
1 /* |
2 * Copyright (c) 2011, 2012 Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2011, 2012, 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. |
175 // Recalculate all the sizes from scratch. We assume that this is |
175 // Recalculate all the sizes from scratch. We assume that this is |
176 // called at a point where no concurrent updates to the various |
176 // called at a point where no concurrent updates to the various |
177 // values we read here are possible (i.e., at a STW phase at the end |
177 // values we read here are possible (i.e., at a STW phase at the end |
178 // of a GC). |
178 // of a GC). |
179 |
179 |
180 size_t young_list_length = g1->young_list()->length(); |
180 uint young_list_length = g1->young_list()->length(); |
181 size_t survivor_list_length = g1->g1_policy()->recorded_survivor_regions(); |
181 uint survivor_list_length = g1->g1_policy()->recorded_survivor_regions(); |
182 assert(young_list_length >= survivor_list_length, "invariant"); |
182 assert(young_list_length >= survivor_list_length, "invariant"); |
183 size_t eden_list_length = young_list_length - survivor_list_length; |
183 uint eden_list_length = young_list_length - survivor_list_length; |
184 // Max length includes any potential extensions to the young gen |
184 // Max length includes any potential extensions to the young gen |
185 // we'll do when the GC locker is active. |
185 // we'll do when the GC locker is active. |
186 size_t young_list_max_length = g1->g1_policy()->young_list_max_length(); |
186 uint young_list_max_length = g1->g1_policy()->young_list_max_length(); |
187 assert(young_list_max_length >= survivor_list_length, "invariant"); |
187 assert(young_list_max_length >= survivor_list_length, "invariant"); |
188 size_t eden_list_max_length = young_list_max_length - survivor_list_length; |
188 uint eden_list_max_length = young_list_max_length - survivor_list_length; |
189 |
189 |
190 _overall_used = g1->used_unlocked(); |
190 _overall_used = g1->used_unlocked(); |
191 _eden_used = eden_list_length * HeapRegion::GrainBytes; |
191 _eden_used = (size_t) eden_list_length * HeapRegion::GrainBytes; |
192 _survivor_used = survivor_list_length * HeapRegion::GrainBytes; |
192 _survivor_used = (size_t) survivor_list_length * HeapRegion::GrainBytes; |
193 _young_region_num = young_list_length; |
193 _young_region_num = young_list_length; |
194 _old_used = subtract_up_to_zero(_overall_used, _eden_used + _survivor_used); |
194 _old_used = subtract_up_to_zero(_overall_used, _eden_used + _survivor_used); |
195 |
195 |
196 // First calculate the committed sizes that can be calculated independently. |
196 // First calculate the committed sizes that can be calculated independently. |
197 _survivor_committed = _survivor_used; |
197 _survivor_committed = _survivor_used; |
205 // survivor and old space). |
205 // survivor and old space). |
206 assert(committed >= (_survivor_committed + _old_committed), "sanity"); |
206 assert(committed >= (_survivor_committed + _old_committed), "sanity"); |
207 committed -= _survivor_committed + _old_committed; |
207 committed -= _survivor_committed + _old_committed; |
208 |
208 |
209 // Next, calculate and remove the committed size for the eden. |
209 // Next, calculate and remove the committed size for the eden. |
210 _eden_committed = eden_list_max_length * HeapRegion::GrainBytes; |
210 _eden_committed = (size_t) eden_list_max_length * HeapRegion::GrainBytes; |
211 // Somewhat defensive: be robust in case there are inaccuracies in |
211 // Somewhat defensive: be robust in case there are inaccuracies in |
212 // the calculations |
212 // the calculations |
213 _eden_committed = MIN2(_eden_committed, committed); |
213 _eden_committed = MIN2(_eden_committed, committed); |
214 committed -= _eden_committed; |
214 committed -= _eden_committed; |
215 |
215 |
235 G1CollectedHeap* g1 = g1h(); |
235 G1CollectedHeap* g1 = g1h(); |
236 |
236 |
237 // When a new eden region is allocated, only the eden_used size is |
237 // When a new eden region is allocated, only the eden_used size is |
238 // affected (since we have recalculated everything else at the last GC). |
238 // affected (since we have recalculated everything else at the last GC). |
239 |
239 |
240 size_t young_region_num = g1h()->young_list()->length(); |
240 uint young_region_num = g1h()->young_list()->length(); |
241 if (young_region_num > _young_region_num) { |
241 if (young_region_num > _young_region_num) { |
242 size_t diff = young_region_num - _young_region_num; |
242 uint diff = young_region_num - _young_region_num; |
243 _eden_used += diff * HeapRegion::GrainBytes; |
243 _eden_used += (size_t) diff * HeapRegion::GrainBytes; |
244 // Somewhat defensive: cap the eden used size to make sure it |
244 // Somewhat defensive: cap the eden used size to make sure it |
245 // never exceeds the committed size. |
245 // never exceeds the committed size. |
246 _eden_used = MIN2(_eden_used, _eden_committed); |
246 _eden_used = MIN2(_eden_used, _eden_committed); |
247 _young_region_num = young_region_num; |
247 _young_region_num = young_region_num; |
248 } |
248 } |