annotate src/share/vm/services/memBaseline.cpp @ 20366:dd3939fe8424

8054546: NMT2 leaks memory Summary: Fixed memory leak in NMT by baselining memory in c heap instead of an arena. Reviewed-by: coleenp, minqi
author zgu
date Wed, 20 Aug 2014 08:41:15 -0400
parents 833b0f92429a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
1 /*
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
4 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
8 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
13 * accompanied this code).
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
14 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
18 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
21 * questions.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
22 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
23 */
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
24 #include "precompiled.hpp"
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
25
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
26 #include "memory/allocation.hpp"
10148
fbca7eaeac2e 8011218: Kitchensink hanged, likely NMT is to blame
zgu
parents: 7971
diff changeset
27 #include "runtime/safepoint.hpp"
fbca7eaeac2e 8011218: Kitchensink hanged, likely NMT is to blame
zgu
parents: 7971
diff changeset
28 #include "runtime/thread.inline.hpp"
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
29 #include "services/memBaseline.hpp"
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
30 #include "services/memTracker.hpp"
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
31
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
32 /*
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
33 * Sizes are sorted in descenting order for reporting
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
34 */
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
35 int compare_malloc_size(const MallocSite& s1, const MallocSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
36 if (s1.size() == s2.size()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
37 return 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
38 } else if (s1.size() > s2.size()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
39 return -1;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
40 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
41 return 1;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
42 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
43 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
44
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
45
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
46 int compare_virtual_memory_size(const VirtualMemoryAllocationSite& s1,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
47 const VirtualMemoryAllocationSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
48 if (s1.reserved() == s2.reserved()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
49 return 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
50 } else if (s1.reserved() > s2.reserved()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
51 return -1;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
52 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
53 return 1;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
54 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
55 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
56
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
57 // Sort into allocation site addresses order for baseline comparison
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
58 int compare_malloc_site(const MallocSite& s1, const MallocSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
59 return s1.call_stack()->compare(*s2.call_stack());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
60 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
61
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
62
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
63 int compare_virtual_memory_site(const VirtualMemoryAllocationSite& s1,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
64 const VirtualMemoryAllocationSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
65 return s1.call_stack()->compare(*s2.call_stack());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
66 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
67
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
68 /*
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
69 * Walker to walk malloc allocation site table
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
70 */
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
71 class MallocAllocationSiteWalker : public MallocSiteWalker {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
72 private:
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
73 SortedLinkedList<MallocSite, compare_malloc_size> _malloc_sites;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
74 size_t _count;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
75
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
76 // Entries in MallocSiteTable with size = 0 and count = 0,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
77 // when the malloc site is not longer there.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
78 public:
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
79 MallocAllocationSiteWalker() : _count(0) { }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
80
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
81 inline size_t count() const { return _count; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
82
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
83 LinkedList<MallocSite>* malloc_sites() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
84 return &_malloc_sites;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
85 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
86
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
87 bool do_malloc_site(const MallocSite* site) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
88 if (site->size() >= MemBaseline::SIZE_THRESHOLD) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
89 if (_malloc_sites.add(*site) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
90 _count++;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
91 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
92 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
93 return false; // OOM
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
94 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
95 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
96 // malloc site does not meet threshold, ignore and continue
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
97 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
98 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
99 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
100 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
101
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
102 // Compare virtual memory region's base address
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
103 int compare_virtual_memory_base(const ReservedMemoryRegion& r1, const ReservedMemoryRegion& r2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
104 return r1.compare(r2);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
105 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
106
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
107 // Walk all virtual memory regions for baselining
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
108 class VirtualMemoryAllocationWalker : public VirtualMemoryWalker {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
109 private:
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
110 SortedLinkedList<ReservedMemoryRegion, compare_virtual_memory_base>
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
111 _virtual_memory_regions;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
112 size_t _count;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
113
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
114 public:
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
115 VirtualMemoryAllocationWalker() : _count(0) { }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
116
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
117 bool do_allocation_site(const ReservedMemoryRegion* rgn) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
118 if (rgn->size() >= MemBaseline::SIZE_THRESHOLD) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
119 if (_virtual_memory_regions.add(*rgn) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
120 _count ++;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
121 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
122 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
123 return false;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
124 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
125 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
126 return true;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
127 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
128
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
129 LinkedList<ReservedMemoryRegion>* virtual_memory_allocations() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
130 return &_virtual_memory_regions;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
131 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
132 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
133
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
134
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
135 bool MemBaseline::baseline_summary() {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
136 MallocMemorySummary::snapshot(&_malloc_memory_snapshot);
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
137 VirtualMemorySummary::snapshot(&_virtual_memory_snapshot);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
138 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
139 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
140
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
141 bool MemBaseline::baseline_allocation_sites() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
142 // Malloc allocation sites
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
143 MallocAllocationSiteWalker malloc_walker;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
144 if (!MallocSiteTable::walk_malloc_site(&malloc_walker)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
145 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
146 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
147
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
148 _malloc_sites.move(malloc_walker.malloc_sites());
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
149 // The malloc sites are collected in size order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
150 _malloc_sites_order = by_size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
151
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
152 // Virtual memory allocation sites
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
153 VirtualMemoryAllocationWalker virtual_memory_walker;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
154 if (!VirtualMemoryTracker::walk_virtual_memory(&virtual_memory_walker)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
155 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
156 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
157
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
158 // Virtual memory allocations are collected in call stack order
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
159 _virtual_memory_allocations.move(virtual_memory_walker.virtual_memory_allocations());
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
160
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
161 if (!aggregate_virtual_memory_allocation_sites()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
162 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
163 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
164 // Virtual memory allocation sites are aggregrated in call stack order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
165 _virtual_memory_sites_order = by_address;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
166
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
167 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
168 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
169
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
170 bool MemBaseline::baseline(bool summaryOnly) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
171 reset();
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
172
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
173 _class_count = InstanceKlass::number_of_instance_classes();
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
174
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
175 if (!baseline_summary()) {
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
176 return false;
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
177 }
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
178
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
179 _baseline_type = Summary_baselined;
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
180
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
181 // baseline details
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
182 if (!summaryOnly &&
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
183 MemTracker::tracking_level() == NMT_detail) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
184 baseline_allocation_sites();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
185 _baseline_type = Detail_baselined;
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
186 }
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
187
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
188 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
189 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
190
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
191 int compare_allocation_site(const VirtualMemoryAllocationSite& s1,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
192 const VirtualMemoryAllocationSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
193 return s1.call_stack()->compare(*s2.call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
194 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
195
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
196 bool MemBaseline::aggregate_virtual_memory_allocation_sites() {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
197 SortedLinkedList<VirtualMemoryAllocationSite, compare_allocation_site> allocation_sites;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
198
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
199 VirtualMemoryAllocationIterator itr = virtual_memory_allocations();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
200 const ReservedMemoryRegion* rgn;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
201 VirtualMemoryAllocationSite* site;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
202 while ((rgn = itr.next()) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
203 VirtualMemoryAllocationSite tmp(*rgn->call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
204 site = allocation_sites.find(tmp);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
205 if (site == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
206 LinkedListNode<VirtualMemoryAllocationSite>* node =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
207 allocation_sites.add(tmp);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
208 if (node == NULL) return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
209 site = node->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
210 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
211 site->reserve_memory(rgn->size());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
212 site->commit_memory(rgn->committed_size());
10148
fbca7eaeac2e 8011218: Kitchensink hanged, likely NMT is to blame
zgu
parents: 7971
diff changeset
213 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
214
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
215 _virtual_memory_sites.move(&allocation_sites);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
216 return true;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
217 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
218
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
219 MallocSiteIterator MemBaseline::malloc_sites(SortingOrder order) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
220 assert(!_malloc_sites.is_empty(), "Not detail baseline");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
221 switch(order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
222 case by_size:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
223 malloc_sites_to_size_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
224 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
225 case by_site:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
226 malloc_sites_to_allocation_site_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
227 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
228 case by_address:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
229 default:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
230 ShouldNotReachHere();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
231 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
232 return MallocSiteIterator(_malloc_sites.head());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
233 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
234
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
235 VirtualMemorySiteIterator MemBaseline::virtual_memory_sites(SortingOrder order) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
236 assert(!_virtual_memory_sites.is_empty(), "Not detail baseline");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
237 switch(order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
238 case by_size:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
239 virtual_memory_sites_to_size_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
240 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
241 case by_site:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
242 virtual_memory_sites_to_reservation_site_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
243 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
244 case by_address:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
245 default:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
246 ShouldNotReachHere();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
247 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
248 return VirtualMemorySiteIterator(_virtual_memory_sites.head());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
249 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
250
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
251
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
252 // Sorting allocations sites in different orders
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
253 void MemBaseline::malloc_sites_to_size_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
254 if (_malloc_sites_order != by_size) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
255 SortedLinkedList<MallocSite, compare_malloc_size> tmp;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
256
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
257 // Add malloc sites to sorted linked list to sort into size order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
258 tmp.move(&_malloc_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
259 _malloc_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
260 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
261 _malloc_sites_order = by_size;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
262 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
263 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
264
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
265 void MemBaseline::malloc_sites_to_allocation_site_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
266 if (_malloc_sites_order != by_site) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
267 SortedLinkedList<MallocSite, compare_malloc_site> tmp;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
268 // Add malloc sites to sorted linked list to sort into site (address) order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
269 tmp.move(&_malloc_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
270 _malloc_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
271 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
272 _malloc_sites_order = by_site;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
273 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
274 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
275
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
276 void MemBaseline::virtual_memory_sites_to_size_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
277 if (_virtual_memory_sites_order != by_size) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
278 SortedLinkedList<VirtualMemoryAllocationSite, compare_virtual_memory_size> tmp;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
279
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
280 tmp.move(&_virtual_memory_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
281
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
282 _virtual_memory_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
283 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
284 _virtual_memory_sites_order = by_size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
285 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
286 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
287
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
288 void MemBaseline::virtual_memory_sites_to_reservation_site_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
289 if (_virtual_memory_sites_order != by_size) {
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
290 SortedLinkedList<VirtualMemoryAllocationSite, compare_virtual_memory_site> tmp;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
291
20366
dd3939fe8424 8054546: NMT2 leaks memory
zgu
parents: 20360
diff changeset
292 tmp.move(&_virtual_memory_sites);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
293
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
294 _virtual_memory_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
295 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
296
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
297 _virtual_memory_sites_order = by_size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
298 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
299 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
300