6197
|
1 /*
|
20360
|
2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
|
6197
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 *
|
|
5 * This code is free software; you can redistribute it and/or modify it
|
|
6 * under the terms of the GNU General Public License version 2 only, as
|
|
7 * published by the Free Software Foundation.
|
|
8 *
|
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 * version 2 for more details (a copy is included in the LICENSE file that
|
|
13 * accompanied this code).
|
|
14 *
|
|
15 * You should have received a copy of the GNU General Public License version
|
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 *
|
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
20 * or visit www.oracle.com if you need additional information or have any
|
|
21 * questions.
|
|
22 *
|
|
23 */
|
|
24
|
|
25 #ifndef SHARE_VM_SERVICES_MEM_BASELINE_HPP
|
|
26 #define SHARE_VM_SERVICES_MEM_BASELINE_HPP
|
|
27
|
20360
|
28 #if INCLUDE_NMT
|
|
29
|
6197
|
30 #include "memory/allocation.hpp"
|
|
31 #include "runtime/mutex.hpp"
|
20360
|
32 #include "services/mallocSiteTable.hpp"
|
|
33 #include "services/mallocTracker.hpp"
|
|
34 #include "services/nmtCommon.hpp"
|
|
35 #include "services/virtualMemoryTracker.hpp"
|
|
36 #include "utilities/linkedlist.hpp"
|
6197
|
37
|
20360
|
38 typedef LinkedListIterator<MallocSite> MallocSiteIterator;
|
|
39 typedef LinkedListIterator<VirtualMemoryAllocationSite> VirtualMemorySiteIterator;
|
|
40 typedef LinkedListIterator<ReservedMemoryRegion> VirtualMemoryAllocationIterator;
|
6197
|
41
|
|
42 /*
|
20360
|
43 * Baseline a memory snapshot
|
6197
|
44 */
|
20360
|
45 class MemBaseline VALUE_OBJ_CLASS_SPEC {
|
6197
|
46 public:
|
20360
|
47 enum BaselineThreshold {
|
|
48 SIZE_THRESHOLD = K // Only allocation size over this threshold will be baselined.
|
|
49 };
|
6197
|
50
|
20360
|
51 enum BaselineType {
|
|
52 Not_baselined,
|
|
53 Summary_baselined,
|
|
54 Detail_baselined
|
|
55 };
|
6197
|
56
|
20360
|
57 enum SortingOrder {
|
|
58 by_address, // by memory address
|
|
59 by_size, // by memory size
|
|
60 by_site // by call site where the memory is allocated from
|
6197
|
61 };
|
|
62
|
20360
|
63 private:
|
|
64 // Summary information
|
20366
|
65 MallocMemorySnapshot _malloc_memory_snapshot;
|
|
66 VirtualMemorySnapshot _virtual_memory_snapshot;
|
20360
|
67
|
|
68 size_t _class_count;
|
6197
|
69
|
20360
|
70 // Allocation sites information
|
|
71 // Malloc allocation sites
|
20366
|
72 LinkedListImpl<MallocSite> _malloc_sites;
|
20360
|
73
|
|
74 // All virtual memory allocations
|
20366
|
75 LinkedListImpl<ReservedMemoryRegion> _virtual_memory_allocations;
|
6197
|
76
|
20360
|
77 // Virtual memory allocations by allocation sites, always in by_address
|
|
78 // order
|
20366
|
79 LinkedListImpl<VirtualMemoryAllocationSite> _virtual_memory_sites;
|
20360
|
80
|
|
81 SortingOrder _malloc_sites_order;
|
|
82 SortingOrder _virtual_memory_sites_order;
|
|
83
|
|
84 BaselineType _baseline_type;
|
6197
|
85
|
|
86 public:
|
20360
|
87 // create a memory baseline
|
|
88 MemBaseline():
|
|
89 _baseline_type(Not_baselined),
|
20366
|
90 _class_count(0) {
|
6197
|
91 }
|
|
92
|
20360
|
93 ~MemBaseline() {
|
|
94 reset();
|
6197
|
95 }
|
|
96
|
20360
|
97 bool baseline(bool summaryOnly = true);
|
6197
|
98
|
20360
|
99 BaselineType baseline_type() const { return _baseline_type; }
|
6197
|
100
|
20366
|
101 MallocMemorySnapshot* malloc_memory_snapshot() {
|
|
102 return &_malloc_memory_snapshot;
|
6197
|
103 }
|
|
104
|
20366
|
105 VirtualMemorySnapshot* virtual_memory_snapshot() {
|
|
106 return &_virtual_memory_snapshot;
|
6197
|
107 }
|
|
108
|
20360
|
109 MallocSiteIterator malloc_sites(SortingOrder order);
|
|
110 VirtualMemorySiteIterator virtual_memory_sites(SortingOrder order);
|
6197
|
111
|
20360
|
112 // Virtual memory allocation iterator always returns in virtual memory
|
|
113 // base address order.
|
|
114 VirtualMemoryAllocationIterator virtual_memory_allocations() {
|
|
115 assert(!_virtual_memory_allocations.is_empty(), "Not detail baseline");
|
|
116 return VirtualMemoryAllocationIterator(_virtual_memory_allocations.head());
|
6197
|
117 }
|
|
118
|
20360
|
119 // Total reserved memory = total malloc'd memory + total reserved virtual
|
|
120 // memory
|
|
121 size_t total_reserved_memory() const {
|
|
122 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
20366
|
123 size_t amount = _malloc_memory_snapshot.total() +
|
|
124 _virtual_memory_snapshot.total_reserved();
|
20360
|
125 return amount;
|
6197
|
126 }
|
|
127
|
20360
|
128 // Total committed memory = total malloc'd memory + total committed
|
|
129 // virtual memory
|
|
130 size_t total_committed_memory() const {
|
|
131 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
20366
|
132 size_t amount = _malloc_memory_snapshot.total() +
|
|
133 _virtual_memory_snapshot.total_committed();
|
20360
|
134 return amount;
|
6197
|
135 }
|
|
136
|
20360
|
137 size_t total_arena_memory() const {
|
|
138 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
20366
|
139 return _malloc_memory_snapshot.total_arena();
|
6197
|
140 }
|
|
141
|
20360
|
142 size_t malloc_tracking_overhead() const {
|
|
143 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
20366
|
144 MemBaseline* bl = const_cast<MemBaseline*>(this);
|
|
145 return bl->_malloc_memory_snapshot.malloc_overhead()->size();
|
6197
|
146 }
|
|
147
|
20366
|
148 MallocMemory* malloc_memory(MEMFLAGS flag) {
|
|
149 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
|
150 return _malloc_memory_snapshot.by_type(flag);
|
6197
|
151 }
|
|
152
|
20366
|
153 VirtualMemory* virtual_memory(MEMFLAGS flag) {
|
|
154 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
|
155 return _virtual_memory_snapshot.by_type(flag);
|
6197
|
156 }
|
|
157
|
|
158
|
20360
|
159 size_t class_count() const {
|
|
160 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
|
161 return _class_count;
|
6197
|
162 }
|
|
163
|
20360
|
164 size_t thread_count() const {
|
|
165 assert(baseline_type() != Not_baselined, "Not yet baselined");
|
20366
|
166 return _malloc_memory_snapshot.thread_count();
|
6197
|
167 }
|
|
168
|
|
169 // reset the baseline for reuse
|
20360
|
170 void reset() {
|
|
171 _baseline_type = Not_baselined;
|
20366
|
172 _malloc_memory_snapshot.reset();
|
|
173 _virtual_memory_snapshot.reset();
|
20360
|
174 _class_count = 0;
|
6197
|
175
|
20366
|
176 _malloc_sites.clear();
|
|
177 _virtual_memory_sites.clear();
|
|
178 _virtual_memory_allocations.clear();
|
6197
|
179 }
|
|
180
|
20360
|
181 private:
|
|
182 // Baseline summary information
|
|
183 bool baseline_summary();
|
6197
|
184
|
20360
|
185 // Baseline allocation sites (detail tracking only)
|
|
186 bool baseline_allocation_sites();
|
|
187
|
|
188 // Aggregate virtual memory allocation by allocation sites
|
|
189 bool aggregate_virtual_memory_allocation_sites();
|
6197
|
190
|
20360
|
191 // Sorting allocation sites in different orders
|
|
192 // Sort allocation sites in size order
|
|
193 void malloc_sites_to_size_order();
|
|
194 // Sort allocation sites in call site address order
|
|
195 void malloc_sites_to_allocation_site_order();
|
6197
|
196
|
20360
|
197 // Sort allocation sites in reserved size order
|
|
198 void virtual_memory_sites_to_size_order();
|
|
199 // Sort allocation sites in call site address order
|
|
200 void virtual_memory_sites_to_reservation_site_order();
|
6197
|
201 };
|
|
202
|
20360
|
203 #endif // INCLUDE_NMT
|
6197
|
204
|
|
205 #endif // SHARE_VM_SERVICES_MEM_BASELINE_HPP
|