Mercurial > hg > truffle
comparison src/share/vm/services/memTracker.cpp @ 20553:417e3b8d04c5
8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
Summary: Disallow increasing native memory tracking level
Reviewed-by: hseigel, ctornqvi, gtriantafill
author | coleenp |
---|---|
date | Fri, 10 Oct 2014 19:36:12 +0000 |
parents | c6211b707068 |
children |
comparison
equal
deleted
inserted
replaced
20547:fffbcc20bf61 | 20553:417e3b8d04c5 |
---|---|
142 ShouldNotReachHere(); | 142 ShouldNotReachHere(); |
143 } | 143 } |
144 } | 144 } |
145 | 145 |
146 | 146 |
147 // Shutdown can only be issued via JCmd, and NMT JCmd is serialized | 147 // Shutdown can only be issued via JCmd, and NMT JCmd is serialized by lock |
148 // by lock | |
149 void MemTracker::shutdown() { | 148 void MemTracker::shutdown() { |
150 // We can only shutdown NMT to minimal tracking level if it is | 149 // We can only shutdown NMT to minimal tracking level if it is ever on. |
151 // ever on. | |
152 if (tracking_level () > NMT_minimal) { | 150 if (tracking_level () > NMT_minimal) { |
153 transition_to(NMT_minimal); | 151 transition_to(NMT_minimal); |
154 } | 152 } |
155 } | 153 } |
156 | 154 |
157 bool MemTracker::transition_to(NMT_TrackingLevel level) { | 155 bool MemTracker::transition_to(NMT_TrackingLevel level) { |
158 NMT_TrackingLevel current_level = tracking_level(); | 156 NMT_TrackingLevel current_level = tracking_level(); |
157 | |
158 assert(level != NMT_off || current_level == NMT_off, "Cannot transition NMT to off"); | |
159 | 159 |
160 if (current_level == level) { | 160 if (current_level == level) { |
161 return true; | 161 return true; |
162 } else if (current_level > level) { | 162 } else if (current_level > level) { |
163 // Downgrade tracking level, we want to lower the tracking | 163 // Downgrade tracking level, we want to lower the tracking level first |
164 // level first | |
165 _tracking_level = level; | 164 _tracking_level = level; |
166 // Make _tracking_level visible immediately. | 165 // Make _tracking_level visible immediately. |
167 OrderAccess::fence(); | 166 OrderAccess::fence(); |
168 VirtualMemoryTracker::transition(current_level, level); | 167 VirtualMemoryTracker::transition(current_level, level); |
169 MallocTracker::transition(current_level, level); | 168 MallocTracker::transition(current_level, level); |
170 | |
171 if (level == NMT_minimal) _baseline.reset(); | |
172 } else { | 169 } else { |
173 VirtualMemoryTracker::transition(current_level, level); | 170 // Upgrading tracking level is not supported and has never been supported. |
174 MallocTracker::transition(current_level, level); | 171 // Allocating and deallocating malloc tracking structures is not thread safe and |
175 | 172 // leads to inconsistencies unless a lot coarser locks are added. |
176 _tracking_level = level; | 173 } |
177 // Make _tracking_level visible immediately. | |
178 OrderAccess::fence(); | |
179 } | |
180 | |
181 return true; | 174 return true; |
182 } | 175 } |
183 | 176 |
184 void MemTracker::final_report(outputStream* output) { | 177 void MemTracker::report(bool summary_only, outputStream* output) { |
185 assert(output != NULL, "No output stream"); | 178 assert(output != NULL, "No output stream"); |
186 if (tracking_level() >= NMT_summary) { | 179 MemBaseline baseline; |
187 MallocMemorySnapshot* malloc_memory_snapshot = | 180 if (baseline.baseline(summary_only)) { |
188 MallocMemorySummary::as_snapshot(); | 181 if (summary_only) { |
189 malloc_memory_snapshot->make_adjustment(); | 182 MemSummaryReporter rpt(baseline, output); |
190 | 183 rpt.report(); |
191 VirtualMemorySnapshot* virtual_memory_snapshot = | 184 } else { |
192 VirtualMemorySummary::as_snapshot(); | 185 MemDetailReporter rpt(baseline, output); |
193 | 186 rpt.report(); |
194 MemSummaryReporter rptr(malloc_memory_snapshot, | 187 } |
195 virtual_memory_snapshot, output); | |
196 rptr.report(); | |
197 // shutdown NMT, the data no longer accurate | |
198 shutdown(); | |
199 } | 188 } |
200 } | 189 } |
201 | 190 |
202 // This is a walker to gather malloc site hashtable statistics, | 191 // This is a walker to gather malloc site hashtable statistics, |
203 // the result is used for tuning. | 192 // the result is used for tuning. |