annotate src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 5888334c9c24
children c319b188c7b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
1 /*
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
4 *
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
7 * published by the Free Software Foundation.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
8 *
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
13 * accompanied this code).
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
14 *
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
18 *
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
21 * questions.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
22 *
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
23 */
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
24
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
25 #include "precompiled.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
26 #include "gc_implementation/g1/concurrentG1Refine.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
27 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
28 #include "gc_implementation/g1/heapRegion.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
30 #include "gc_implementation/g1/g1RemSet.inline.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
31 #include "gc_implementation/g1/g1RemSetSummary.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
32 #include "gc_implementation/g1/heapRegionRemSet.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
33 #include "runtime/thread.inline.hpp"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
34
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
35 class GetRSThreadVTimeClosure : public ThreadClosure {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
36 private:
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
37 G1RemSetSummary* _summary;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
38 uint _counter;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
39
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
40 public:
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
41 GetRSThreadVTimeClosure(G1RemSetSummary * summary) : ThreadClosure(), _summary(summary), _counter(0) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
42 assert(_summary != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
43 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
44
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
45 virtual void do_thread(Thread* t) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
46 ConcurrentG1RefineThread* crt = (ConcurrentG1RefineThread*) t;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
47 _summary->set_rs_thread_vtime(_counter, crt->vtime_accum());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
48 _counter++;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
49 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
50 };
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
51
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
52 void G1RemSetSummary::update() {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
53 _num_refined_cards = remset()->conc_refine_cards();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
54 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
55 _num_processed_buf_mutator = dcqs.processed_buffers_mut();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
56 _num_processed_buf_rs_threads = dcqs.processed_buffers_rs_thread();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
57
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
58 _num_coarsenings = HeapRegionRemSet::n_coarsenings();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
59
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
60 ConcurrentG1Refine * cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
61 if (_rs_threads_vtimes != NULL) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
62 GetRSThreadVTimeClosure p(this);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
63 cg1r->worker_threads_do(&p);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
64 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
65 set_sampling_thread_vtime(cg1r->sampling_thread()->vtime_accum());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
66 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
67
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
68 void G1RemSetSummary::set_rs_thread_vtime(uint thread, double value) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
69 assert(_rs_threads_vtimes != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
70 assert(thread < _num_vtimes, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
71 _rs_threads_vtimes[thread] = value;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
72 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
73
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
74 double G1RemSetSummary::rs_thread_vtime(uint thread) const {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
75 assert(_rs_threads_vtimes != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
76 assert(thread < _num_vtimes, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
77 return _rs_threads_vtimes[thread];
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
78 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
79
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
80 void G1RemSetSummary::initialize(G1RemSet* remset, uint num_workers) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
81 assert(_rs_threads_vtimes == NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
82 assert(remset != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
83
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
84 _remset = remset;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
85 _num_vtimes = num_workers;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
86 _rs_threads_vtimes = NEW_C_HEAP_ARRAY(double, _num_vtimes, mtGC);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
87 memset(_rs_threads_vtimes, 0, sizeof(double) * _num_vtimes);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
88
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
89 update();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
90 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
91
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
92 void G1RemSetSummary::set(G1RemSetSummary* other) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
93 assert(other != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
94 assert(remset() == other->remset(), "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
95 assert(_num_vtimes == other->_num_vtimes, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
96
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
97 _num_refined_cards = other->num_concurrent_refined_cards();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
98
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
99 _num_processed_buf_mutator = other->num_processed_buf_mutator();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
100 _num_processed_buf_rs_threads = other->num_processed_buf_rs_threads();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
101
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
102 _num_coarsenings = other->_num_coarsenings;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
103
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
104 memcpy(_rs_threads_vtimes, other->_rs_threads_vtimes, sizeof(double) * _num_vtimes);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
105
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
106 set_sampling_thread_vtime(other->sampling_thread_vtime());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
107 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
108
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
109 void G1RemSetSummary::subtract_from(G1RemSetSummary* other) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
110 assert(other != NULL, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
111 assert(remset() == other->remset(), "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
112 assert(_num_vtimes == other->_num_vtimes, "just checking");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
113
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
114 _num_refined_cards = other->num_concurrent_refined_cards() - _num_refined_cards;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
115
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
116 _num_processed_buf_mutator = other->num_processed_buf_mutator() - _num_processed_buf_mutator;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
117 _num_processed_buf_rs_threads = other->num_processed_buf_rs_threads() - _num_processed_buf_rs_threads;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
118
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
119 _num_coarsenings = other->num_coarsenings() - _num_coarsenings;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
120
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
121 for (uint i = 0; i < _num_vtimes; i++) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
122 set_rs_thread_vtime(i, other->rs_thread_vtime(i) - rs_thread_vtime(i));
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
123 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
124
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
125 _sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
126 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
127
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
128 class HRRSStatsIter: public HeapRegionClosure {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
129 size_t _occupied;
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
130
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
131 size_t _total_rs_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
132 size_t _max_rs_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
133 HeapRegion* _max_rs_mem_sz_region;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
134
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
135 size_t _total_code_root_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
136 size_t _max_code_root_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
137 HeapRegion* _max_code_root_mem_sz_region;
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
138 public:
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
139 HRRSStatsIter() :
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
140 _occupied(0),
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
141 _total_rs_mem_sz(0),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
142 _max_rs_mem_sz(0),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
143 _max_rs_mem_sz_region(NULL),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
144 _total_code_root_mem_sz(0),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
145 _max_code_root_mem_sz(0),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
146 _max_code_root_mem_sz_region(NULL)
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
147 {}
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
148
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
149 bool doHeapRegion(HeapRegion* r) {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
150 HeapRegionRemSet* hrrs = r->rem_set();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
151
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
152 // HeapRegionRemSet::mem_size() includes the
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
153 // size of the strong code roots
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
154 size_t rs_mem_sz = hrrs->mem_size();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
155 if (rs_mem_sz > _max_rs_mem_sz) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
156 _max_rs_mem_sz = rs_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
157 _max_rs_mem_sz_region = r;
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
158 }
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
159 _total_rs_mem_sz += rs_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
160
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
161 size_t code_root_mem_sz = hrrs->strong_code_roots_mem_size();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
162 if (code_root_mem_sz > _max_code_root_mem_sz) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
163 _max_code_root_mem_sz = code_root_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
164 _max_code_root_mem_sz_region = r;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
165 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
166 _total_code_root_mem_sz += code_root_mem_sz;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
167
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
168 size_t occ = hrrs->occupied();
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
169 _occupied += occ;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
170 return false;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
171 }
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
172 size_t total_rs_mem_sz() { return _total_rs_mem_sz; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
173 size_t max_rs_mem_sz() { return _max_rs_mem_sz; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
174 HeapRegion* max_rs_mem_sz_region() { return _max_rs_mem_sz_region; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
175 size_t total_code_root_mem_sz() { return _total_code_root_mem_sz; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
176 size_t max_code_root_mem_sz() { return _max_code_root_mem_sz; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
177 HeapRegion* max_code_root_mem_sz_region() { return _max_code_root_mem_sz_region; }
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
178 size_t occupied() { return _occupied; }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
179 };
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
180
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
181 double calc_percentage(size_t numerator, size_t denominator) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
182 if (denominator != 0) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
183 return (double)numerator / denominator * 100.0;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
184 } else {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
185 return 0.0f;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
186 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
187 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
188
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
189 void G1RemSetSummary::print_on(outputStream* out) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
190 out->print_cr("\n Concurrent RS processed "SIZE_FORMAT" cards",
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
191 num_concurrent_refined_cards());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
192 out->print_cr(" Of %d completed buffers:", num_processed_buf_total());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
193 out->print_cr(" %8d (%5.1f%%) by concurrent RS threads.",
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
194 num_processed_buf_total(),
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
195 calc_percentage(num_processed_buf_rs_threads(), num_processed_buf_total()));
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
196 out->print_cr(" %8d (%5.1f%%) by mutator threads.",
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
197 num_processed_buf_mutator(),
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
198 calc_percentage(num_processed_buf_mutator(), num_processed_buf_total()));
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
199 out->print_cr(" Concurrent RS threads times (s)");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
200 out->print(" ");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
201 for (uint i = 0; i < _num_vtimes; i++) {
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
202 out->print(" %5.2f", rs_thread_vtime(i));
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
203 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
204 out->cr();
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
205 out->print_cr(" Concurrent sampling threads times (s)");
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
206 out->print_cr(" %5.2f", sampling_thread_vtime());
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
207
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
208 HRRSStatsIter blk;
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
209 G1CollectedHeap::heap()->heap_region_iterate(&blk);
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
210 // RemSet stats
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
211 out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
212 " Max = "SIZE_FORMAT"K.",
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
213 blk.total_rs_mem_sz()/K, blk.max_rs_mem_sz()/K);
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
214 out->print_cr(" Static structures = "SIZE_FORMAT"K,"
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
215 " free_lists = "SIZE_FORMAT"K.",
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
216 HeapRegionRemSet::static_mem_size() / K,
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
217 HeapRegionRemSet::fl_mem_size() / K);
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
218 out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
219 blk.occupied());
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
220 HeapRegion* max_rs_mem_sz_region = blk.max_rs_mem_sz_region();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
221 HeapRegionRemSet* max_rs_rem_set = max_rs_mem_sz_region->rem_set();
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
222 out->print_cr(" Max size region = "HR_FORMAT", "
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
223 "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
224 HR_FORMAT_PARAMS(max_rs_mem_sz_region),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
225 (max_rs_rem_set->mem_size() + K - 1)/K,
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
226 (max_rs_rem_set->occupied() + K - 1)/K);
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
227 out->print_cr(" Did %d coarsenings.", num_coarsenings());
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
228 // Strong code root stats
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
229 out->print_cr(" Total heap region code-root set sizes = "SIZE_FORMAT"K."
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
230 " Max = "SIZE_FORMAT"K.",
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
231 blk.total_code_root_mem_sz()/K, blk.max_code_root_mem_sz()/K);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
232 HeapRegion* max_code_root_mem_sz_region = blk.max_code_root_mem_sz_region();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
233 HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region->rem_set();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
234 out->print_cr(" Max size region = "HR_FORMAT", "
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
235 "size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".",
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
236 HR_FORMAT_PARAMS(max_code_root_mem_sz_region),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
237 (max_code_root_rem_set->strong_code_roots_mem_size() + K - 1)/K,
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 10372
diff changeset
238 (max_code_root_rem_set->strong_code_roots_list_length()));
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents:
diff changeset
239 }