annotate src/share/vm/services/memBaseline.cpp @ 20360:833b0f92429a

8046598: Scalable Native memory tracking development Summary: Enhance scalability of native memory tracking Reviewed-by: coleenp, ctornqvi, gtriantafill
author zgu
date Wed, 27 Aug 2014 08:19:12 -0400
parents 72fce0b2d341
children dd3939fe8424
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:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
73 SortedLinkedList<MallocSite, compare_malloc_size, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
74 _malloc_sites;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
75 size_t _count;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
76
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
77 // Entries in MallocSiteTable with size = 0 and count = 0,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
78 // when the malloc site is not longer there.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
79 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
80 MallocAllocationSiteWalker(Arena* arena) : _count(0), _malloc_sites(arena) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
81 }
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 inline size_t count() const { return _count; }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
84
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
85 LinkedList<MallocSite>* malloc_sites() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
86 return &_malloc_sites;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
87 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
88
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
89 bool do_malloc_site(const MallocSite* site) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
90 if (site->size() >= MemBaseline::SIZE_THRESHOLD) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
91 if (_malloc_sites.add(*site) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
92 _count++;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
93 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
94 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
95 return false; // OOM
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
96 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
97 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
98 // malloc site does not meet threshold, ignore and continue
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
99 return true;
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 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
103
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
104 // Compare virtual memory region's base address
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
105 int compare_virtual_memory_base(const ReservedMemoryRegion& r1, const ReservedMemoryRegion& r2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
106 return r1.compare(r2);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
107 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
108
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
109 // Walk all virtual memory regions for baselining
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
110 class VirtualMemoryAllocationWalker : public VirtualMemoryWalker {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
111 private:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
112 SortedLinkedList<ReservedMemoryRegion, compare_virtual_memory_base, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
113 _virtual_memory_regions;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
114 size_t _count;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
115
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
116 public:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
117 VirtualMemoryAllocationWalker(Arena* a) : _count(0), _virtual_memory_regions(a) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
118 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
119
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
120 bool do_allocation_site(const ReservedMemoryRegion* rgn) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
121 if (rgn->size() >= MemBaseline::SIZE_THRESHOLD) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
122 if (_virtual_memory_regions.add(*rgn) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
123 _count ++;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
124 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
125 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
126 return false;
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 return true;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
130 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
131
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
132 LinkedList<ReservedMemoryRegion>* virtual_memory_allocations() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
133 return &_virtual_memory_regions;
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 };
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
136
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
137
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
138 bool MemBaseline::baseline_summary() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
139 assert(_malloc_memory_snapshot == NULL, "Malloc baseline not yet reset");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
140 assert(_virtual_memory_snapshot == NULL, "Virtual baseline not yet reset");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
141
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
142 _malloc_memory_snapshot = new (arena()) MallocMemorySnapshot();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
143 _virtual_memory_snapshot = new (arena()) VirtualMemorySnapshot();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
144 if (_malloc_memory_snapshot == NULL || _virtual_memory_snapshot == NULL) {
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 MallocMemorySummary::snapshot(_malloc_memory_snapshot);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
148 VirtualMemorySummary::snapshot(_virtual_memory_snapshot);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
149 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
150 }
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 bool MemBaseline::baseline_allocation_sites() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
153 assert(arena() != NULL, "Just check");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
154 // Malloc allocation sites
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
155 MallocAllocationSiteWalker malloc_walker(arena());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
156 if (!MallocSiteTable::walk_malloc_site(&malloc_walker)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
157 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
158 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
159
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
160 _malloc_sites.set_head(malloc_walker.malloc_sites()->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
161 // The malloc sites are collected in size order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
162 _malloc_sites_order = by_size;
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
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
165 VirtualMemoryAllocationWalker virtual_memory_walker(arena());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
166 if (!VirtualMemoryTracker::walk_virtual_memory(&virtual_memory_walker)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
167 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
168 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
169
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
170 // Virtual memory allocations are collected in call stack order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
171 _virtual_memory_allocations.set_head(virtual_memory_walker.virtual_memory_allocations()->head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
172
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
173 if (!aggregate_virtual_memory_allocation_sites()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
174 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
175 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
176 // Virtual memory allocation sites are aggregrated in call stack order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
177 _virtual_memory_sites_order = by_address;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
178
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
179 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
180 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
181
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
182 bool MemBaseline::baseline(bool summaryOnly) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
183 if (arena() == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
184 _arena = new (std::nothrow, mtNMT) Arena(mtNMT);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
185 if (arena() == NULL) return false;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
186 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
187
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
188 reset();
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
189
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
190 _class_count = InstanceKlass::number_of_instance_classes();
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
191
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
192 if (!baseline_summary()) {
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
193 return false;
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
194 }
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
195
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
196 _baseline_type = Summary_baselined;
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
197
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
198 // baseline details
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
199 if (!summaryOnly &&
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
200 MemTracker::tracking_level() == NMT_detail) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
201 baseline_allocation_sites();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
202 _baseline_type = Detail_baselined;
6882
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
203 }
716c64bda5ba 7199092: NMT: NMT needs to deal overlapped virtual memory ranges
zgu
parents: 6197
diff changeset
204
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
205 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
206 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
207
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
208 int compare_allocation_site(const VirtualMemoryAllocationSite& s1,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
209 const VirtualMemoryAllocationSite& s2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
210 return s1.call_stack()->compare(*s2.call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
211 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
212
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
213 bool MemBaseline::aggregate_virtual_memory_allocation_sites() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
214 SortedLinkedList<VirtualMemoryAllocationSite, compare_allocation_site, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
215 allocation_sites(arena());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
216
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
217 VirtualMemoryAllocationIterator itr = virtual_memory_allocations();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
218 const ReservedMemoryRegion* rgn;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
219 VirtualMemoryAllocationSite* site;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
220 while ((rgn = itr.next()) != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
221 VirtualMemoryAllocationSite tmp(*rgn->call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
222 site = allocation_sites.find(tmp);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
223 if (site == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
224 LinkedListNode<VirtualMemoryAllocationSite>* node =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
225 allocation_sites.add(tmp);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
226 if (node == NULL) return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
227 site = node->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
228 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
229 site->reserve_memory(rgn->size());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
230 site->commit_memory(rgn->committed_size());
10148
fbca7eaeac2e 8011218: Kitchensink hanged, likely NMT is to blame
zgu
parents: 7971
diff changeset
231 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
232
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
233 _virtual_memory_sites.set_head(allocation_sites.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
234 return true;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
235 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
236
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
237 MallocSiteIterator MemBaseline::malloc_sites(SortingOrder order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
238 assert(!_malloc_sites.is_empty(), "Detail baseline?");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
239 switch(order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
240 case by_size:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
241 malloc_sites_to_size_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
242 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
243 case by_site:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
244 malloc_sites_to_allocation_site_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
245 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
246 case by_address:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
247 default:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
248 ShouldNotReachHere();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
249 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
250 return MallocSiteIterator(_malloc_sites.head());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
251 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
252
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
253 VirtualMemorySiteIterator MemBaseline::virtual_memory_sites(SortingOrder order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
254 assert(!_virtual_memory_sites.is_empty(), "Detail baseline?");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
255 switch(order) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
256 case by_size:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
257 virtual_memory_sites_to_size_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
258 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
259 case by_site:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
260 virtual_memory_sites_to_reservation_site_order();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
261 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
262 case by_address:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
263 default:
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
264 ShouldNotReachHere();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
265 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
266 return VirtualMemorySiteIterator(_virtual_memory_sites.head());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
267 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
268
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
269
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
270 // Sorting allocations sites in different orders
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
271 void MemBaseline::malloc_sites_to_size_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
272 if (_malloc_sites_order != by_size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
273 SortedLinkedList<MallocSite, compare_malloc_size, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
274 tmp(arena());
6197
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 // Add malloc sites to sorted linked list to sort into size order
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
277 tmp.move(&_malloc_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
278 _malloc_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
279 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
280 _malloc_sites_order = by_size;
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
281 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
282 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
283
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
284 void MemBaseline::malloc_sites_to_allocation_site_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
285 if (_malloc_sites_order != by_site) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
286 SortedLinkedList<MallocSite, compare_malloc_site, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
287 tmp(arena());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
288 // 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
289 tmp.move(&_malloc_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
290 _malloc_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
291 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
292 _malloc_sites_order = by_site;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
293 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
294 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
295
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
296 void MemBaseline::virtual_memory_sites_to_size_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
297 if (_virtual_memory_sites_order != by_size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
298 SortedLinkedList<VirtualMemoryAllocationSite, compare_virtual_memory_size, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
299 tmp(arena());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
300
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
301 tmp.move(&_virtual_memory_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
302
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
303 _virtual_memory_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
304 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
305 _virtual_memory_sites_order = by_size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
306 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
307 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
308
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
309 void MemBaseline::virtual_memory_sites_to_reservation_site_order() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
310 if (_virtual_memory_sites_order != by_size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
311 SortedLinkedList<VirtualMemoryAllocationSite, compare_virtual_memory_site, ResourceObj::ARENA>
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
312 tmp(arena());
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
313
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
314 tmp.add(&_virtual_memory_sites);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
315
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
316 _virtual_memory_sites.set_head(tmp.head());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
317 tmp.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
318
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
319 _virtual_memory_sites_order = by_size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents: 11102
diff changeset
320 }
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
321 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
322