annotate src/share/vm/services/virtualMemoryTracker.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 3adc0e278f49
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
1 /*
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
4 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
8 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
13 * accompanied this code).
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
14 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
18 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
21 * questions.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
22 *
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
23 */
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
24 #include "precompiled.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
25
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
26 #include "runtime/threadCritical.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
27 #include "services/virtualMemoryTracker.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
28
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
29 size_t VirtualMemorySummary::_snapshot[CALC_OBJ_SIZE_IN_TYPE(VirtualMemorySnapshot, size_t)];
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
30
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
31 void VirtualMemorySummary::initialize() {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
32 assert(sizeof(_snapshot) >= sizeof(VirtualMemorySnapshot), "Sanity Check");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
33 // Use placement operator new to initialize static data area.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
34 ::new ((void*)_snapshot) VirtualMemorySnapshot();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
35 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
36
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
37 SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>* VirtualMemoryTracker::_reserved_regions;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
38
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
39 int compare_committed_region(const CommittedMemoryRegion& r1, const CommittedMemoryRegion& r2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
40 return r1.compare(r2);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
41 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
42
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
43 int compare_reserved_region_base(const ReservedMemoryRegion& r1, const ReservedMemoryRegion& r2) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
44 return r1.compare(r2);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
45 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
46
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
47 bool ReservedMemoryRegion::add_committed_region(address addr, size_t size, const NativeCallStack& stack) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
48 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
49 assert(size > 0, "Invalid size");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
50 assert(contain_region(addr, size), "Not contain this region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
51
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
52 if (all_committed()) return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
53
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
54 CommittedMemoryRegion committed_rgn(addr, size, stack);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
55 LinkedListNode<CommittedMemoryRegion>* node = _committed_regions.find_node(committed_rgn);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
56 if (node != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
57 CommittedMemoryRegion* rgn = node->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
58 if (rgn->same_region(addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
59 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
60 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
61
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
62 if (rgn->adjacent_to(addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
63 // check if the next region covers this committed region,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
64 // the regions may not be merged due to different call stacks
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
65 LinkedListNode<CommittedMemoryRegion>* next =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
66 node->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
67 if (next != NULL && next->data()->contain_region(addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
68 if (next->data()->same_region(addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
69 next->data()->set_call_stack(stack);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
70 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
71 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
72 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
73 if (rgn->call_stack()->equals(stack)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
74 VirtualMemorySummary::record_uncommitted_memory(rgn->size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
75 // the two adjacent regions have the same call stack, merge them
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
76 rgn->expand_region(addr, size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
77 VirtualMemorySummary::record_committed_memory(rgn->size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
78 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
79 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
80 VirtualMemorySummary::record_committed_memory(size, flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
81 if (rgn->base() > addr) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
82 return _committed_regions.insert_before(committed_rgn, node) != NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
83 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
84 return _committed_regions.insert_after(committed_rgn, node) != NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
85 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
86 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
87 assert(rgn->contain_region(addr, size), "Must cover this region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
88 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
89 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
90 // New committed region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
91 VirtualMemorySummary::record_committed_memory(size, flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
92 return add_committed_region(committed_rgn);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
93 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
94 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
95
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
96 void ReservedMemoryRegion::set_all_committed(bool b) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
97 if (all_committed() != b) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
98 _all_committed = b;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
99 if (b) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
100 VirtualMemorySummary::record_committed_memory(size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
101 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
102 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
103 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
104
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
105 bool ReservedMemoryRegion::remove_uncommitted_region(LinkedListNode<CommittedMemoryRegion>* node,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
106 address addr, size_t size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
107 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
108 assert(size > 0, "Invalid size");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
109
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
110 CommittedMemoryRegion* rgn = node->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
111 assert(rgn->contain_region(addr, size), "Has to be contained");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
112 assert(!rgn->same_region(addr, size), "Can not be the same region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
113
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
114 if (rgn->base() == addr ||
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
115 rgn->end() == addr + size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
116 rgn->exclude_region(addr, size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
117 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
118 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
119 // split this region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
120 address top =rgn->end();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
121 // use this region for lower part
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
122 size_t exclude_size = rgn->end() - addr;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
123 rgn->exclude_region(addr, exclude_size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
124
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
125 // higher part
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
126 address high_base = addr + size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
127 size_t high_size = top - high_base;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
128
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
129 CommittedMemoryRegion high_rgn(high_base, high_size, *rgn->call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
130 LinkedListNode<CommittedMemoryRegion>* high_node = _committed_regions.add(high_rgn);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
131 assert(high_node == NULL || node->next() == high_node, "Should be right after");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
132 return (high_node != NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
133 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
134
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
135 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
136 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
137
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
138 bool ReservedMemoryRegion::remove_uncommitted_region(address addr, size_t sz) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
139 // uncommit stack guard pages
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
140 if (flag() == mtThreadStack && !same_region(addr, sz)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
141 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
142 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
143
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
144 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
145 assert(sz > 0, "Invalid size");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
146
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
147 if (all_committed()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
148 assert(_committed_regions.is_empty(), "Sanity check");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
149 assert(contain_region(addr, sz), "Reserved region does not contain this region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
150 set_all_committed(false);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
151 VirtualMemorySummary::record_uncommitted_memory(sz, flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
152 if (same_region(addr, sz)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
153 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
154 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
155 CommittedMemoryRegion rgn(base(), size(), *call_stack());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
156 if (rgn.base() == addr || rgn.end() == (addr + sz)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
157 rgn.exclude_region(addr, sz);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
158 return add_committed_region(rgn);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
159 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
160 // split this region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
161 // top of the whole region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
162 address top =rgn.end();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
163 // use this region for lower part
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
164 size_t exclude_size = rgn.end() - addr;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
165 rgn.exclude_region(addr, exclude_size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
166 if (add_committed_region(rgn)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
167 // higher part
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
168 address high_base = addr + sz;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
169 size_t high_size = top - high_base;
20364
c6211b707068 8055007: NMT2: emptyStack missing in minimal build
zgu
parents: 20363
diff changeset
170 CommittedMemoryRegion high_rgn(high_base, high_size, NativeCallStack::EMPTY_STACK);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
171 return add_committed_region(high_rgn);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
172 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
173 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
174 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
175 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
176 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
177 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
178 // we have to walk whole list to remove the committed regions in
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
179 // specified range
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
180 LinkedListNode<CommittedMemoryRegion>* head =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
181 _committed_regions.head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
182 LinkedListNode<CommittedMemoryRegion>* prev = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
183 VirtualMemoryRegion uncommitted_rgn(addr, sz);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
184
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
185 while (head != NULL && !uncommitted_rgn.is_empty()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
186 CommittedMemoryRegion* crgn = head->data();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
187 // this committed region overlaps to region to uncommit
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
188 if (crgn->overlap_region(uncommitted_rgn.base(), uncommitted_rgn.size())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
189 if (crgn->same_region(uncommitted_rgn.base(), uncommitted_rgn.size())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
190 // find matched region, remove the node will do
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
191 VirtualMemorySummary::record_uncommitted_memory(uncommitted_rgn.size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
192 _committed_regions.remove_after(prev);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
193 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
194 } else if (crgn->contain_region(uncommitted_rgn.base(), uncommitted_rgn.size())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
195 // this committed region contains whole uncommitted region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
196 VirtualMemorySummary::record_uncommitted_memory(uncommitted_rgn.size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
197 return remove_uncommitted_region(head, uncommitted_rgn.base(), uncommitted_rgn.size());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
198 } else if (uncommitted_rgn.contain_region(crgn->base(), crgn->size())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
199 // this committed region has been uncommitted
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
200 size_t exclude_size = crgn->end() - uncommitted_rgn.base();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
201 uncommitted_rgn.exclude_region(uncommitted_rgn.base(), exclude_size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
202 VirtualMemorySummary::record_uncommitted_memory(crgn->size(), flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
203 LinkedListNode<CommittedMemoryRegion>* tmp = head;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
204 head = head->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
205 _committed_regions.remove_after(prev);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
206 continue;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
207 } else if (crgn->contain_address(uncommitted_rgn.base())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
208 size_t toUncommitted = crgn->end() - uncommitted_rgn.base();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
209 crgn->exclude_region(uncommitted_rgn.base(), toUncommitted);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
210 uncommitted_rgn.exclude_region(uncommitted_rgn.base(), toUncommitted);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
211 VirtualMemorySummary::record_uncommitted_memory(toUncommitted, flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
212 } else if (uncommitted_rgn.contain_address(crgn->base())) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
213 size_t toUncommitted = uncommitted_rgn.end() - crgn->base();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
214 crgn->exclude_region(crgn->base(), toUncommitted);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
215 uncommitted_rgn.exclude_region(uncommitted_rgn.end() - toUncommitted,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
216 toUncommitted);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
217 VirtualMemorySummary::record_uncommitted_memory(toUncommitted, flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
218 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
219 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
220 prev = head;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
221 head = head->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
222 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
223 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
224
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
225 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
226 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
227
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
228 void ReservedMemoryRegion::move_committed_regions(address addr, ReservedMemoryRegion& rgn) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
229 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
230
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
231 // split committed regions
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
232 LinkedListNode<CommittedMemoryRegion>* head =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
233 _committed_regions.head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
234 LinkedListNode<CommittedMemoryRegion>* prev = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
235
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
236 while (head != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
237 if (head->data()->base() >= addr) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
238 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
239 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
240 prev = head;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
241 head = head->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
242 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
243
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
244 if (head != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
245 if (prev != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
246 prev->set_next(head->next());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
247 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
248 _committed_regions.set_head(NULL);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
249 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
250 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
251
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
252 rgn._committed_regions.set_head(head);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
253 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
254
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
255 size_t ReservedMemoryRegion::committed_size() const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
256 if (all_committed()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
257 return size();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
258 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
259 size_t committed = 0;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
260 LinkedListNode<CommittedMemoryRegion>* head =
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
261 _committed_regions.head();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
262 while (head != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
263 committed += head->data()->size();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
264 head = head->next();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
265 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
266 return committed;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
267 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
268 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
269
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
270 void ReservedMemoryRegion::set_flag(MEMFLAGS f) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
271 assert((flag() == mtNone || flag() == f), "Overwrite memory type");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
272 if (flag() != f) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
273 VirtualMemorySummary::move_reserved_memory(flag(), f, size());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
274 VirtualMemorySummary::move_committed_memory(flag(), f, committed_size());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
275 _flag = f;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
276 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
277 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
278
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
279 bool VirtualMemoryTracker::initialize(NMT_TrackingLevel level) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
280 if (level >= NMT_summary) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
281 VirtualMemorySummary::initialize();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
282 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
283 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
284 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
285
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
286 bool VirtualMemoryTracker::late_initialize(NMT_TrackingLevel level) {
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
287 if (level >= NMT_summary) {
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
288 _reserved_regions = new (std::nothrow, ResourceObj::C_HEAP, mtNMT)
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
289 SortedLinkedList<ReservedMemoryRegion, compare_reserved_region_base>();
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
290 return (_reserved_regions != NULL);
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
291 }
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
292 return true;
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
293 }
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
294
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
295 bool VirtualMemoryTracker::add_reserved_region(address base_addr, size_t size,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
296 const NativeCallStack& stack, MEMFLAGS flag, bool all_committed) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
297 assert(base_addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
298 assert(size > 0, "Invalid size");
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
299 assert(_reserved_regions != NULL, "Sanity check");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
300 ReservedMemoryRegion rgn(base_addr, size, stack, flag);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
301 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
302 LinkedListNode<ReservedMemoryRegion>* node;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
303 if (reserved_rgn == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
304 VirtualMemorySummary::record_reserved_memory(size, flag);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
305 node = _reserved_regions->add(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
306 if (node != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
307 node->data()->set_all_committed(all_committed);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
308 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
309 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
310 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
311 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
312 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
313 if (reserved_rgn->same_region(base_addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
314 reserved_rgn->set_call_stack(stack);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
315 reserved_rgn->set_flag(flag);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
316 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
317 } else if (reserved_rgn->adjacent_to(base_addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
318 VirtualMemorySummary::record_reserved_memory(size, flag);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
319 reserved_rgn->expand_region(base_addr, size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
320 reserved_rgn->set_call_stack(stack);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
321 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
322 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
323 // Overlapped reservation.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
324 // It can happen when the regions are thread stacks, as JNI
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
325 // thread does not detach from VM before exits, and leads to
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
326 // leak JavaThread object
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
327 if (reserved_rgn->flag() == mtThreadStack) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
328 guarantee(!CheckJNICalls, "Attached JNI thread exited without being detached");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
329 // Overwrite with new region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
330
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
331 // Release old region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
332 VirtualMemorySummary::record_uncommitted_memory(reserved_rgn->committed_size(), reserved_rgn->flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
333 VirtualMemorySummary::record_released_memory(reserved_rgn->size(), reserved_rgn->flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
334
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
335 // Add new region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
336 VirtualMemorySummary::record_reserved_memory(rgn.size(), flag);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
337
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
338 *reserved_rgn = rgn;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
339 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
340 }
20365
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
341
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
342 // CDS mapping region.
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
343 // CDS reserves the whole region for mapping CDS archive, then maps each section into the region.
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
344 // NMT reports CDS as a whole.
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
345 if (reserved_rgn->flag() == mtClassShared) {
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
346 assert(reserved_rgn->contain_region(base_addr, size), "Reserved CDS region should contain this mapping region");
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
347 return true;
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
348 }
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
349
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
350 ShouldNotReachHere();
3adc0e278f49 8055061: assert at share/vm/services/virtualMemoryTracker.cpp:332 Error: ShouldNotReachHere() when running NMT tests
zgu
parents: 20364
diff changeset
351 return false;
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
352 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
353 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
354 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
355
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
356 void VirtualMemoryTracker::set_reserved_region_type(address addr, MEMFLAGS flag) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
357 assert(addr != NULL, "Invalid address");
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
358 assert(_reserved_regions != NULL, "Sanity check");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
359
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
360 ReservedMemoryRegion rgn(addr, 1);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
361 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
362 if (reserved_rgn != NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
363 assert(reserved_rgn->contain_address(addr), "Containment");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
364 if (reserved_rgn->flag() != flag) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
365 assert(reserved_rgn->flag() == mtNone, "Overwrite memory type");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
366 reserved_rgn->set_flag(flag);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
367 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
368 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
369 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
370
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
371 bool VirtualMemoryTracker::add_committed_region(address addr, size_t size,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
372 const NativeCallStack& stack) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
373 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
374 assert(size > 0, "Invalid size");
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
375 assert(_reserved_regions != NULL, "Sanity check");
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
376
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
377 ReservedMemoryRegion rgn(addr, size);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
378 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
379
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
380 assert(reserved_rgn != NULL, "No reserved region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
381 assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
382 return reserved_rgn->add_committed_region(addr, size, stack);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
383 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
384
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
385 bool VirtualMemoryTracker::remove_uncommitted_region(address addr, size_t size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
386 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
387 assert(size > 0, "Invalid size");
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
388 assert(_reserved_regions != NULL, "Sanity check");
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
389
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
390 ReservedMemoryRegion rgn(addr, size);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
391 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
392 assert(reserved_rgn != NULL, "No reserved region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
393 assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
394 return reserved_rgn->remove_uncommitted_region(addr, size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
395 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
396
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
397 bool VirtualMemoryTracker::remove_released_region(address addr, size_t size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
398 assert(addr != NULL, "Invalid address");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
399 assert(size > 0, "Invalid size");
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
400 assert(_reserved_regions != NULL, "Sanity check");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
401
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
402 ReservedMemoryRegion rgn(addr, size);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
403 ReservedMemoryRegion* reserved_rgn = _reserved_regions->find(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
404
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
405 assert(reserved_rgn != NULL, "No reserved region");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
406
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
407 // uncommit regions within the released region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
408 if (!reserved_rgn->remove_uncommitted_region(addr, size)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
409 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
410 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
411
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
412
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
413 VirtualMemorySummary::record_released_memory(size, reserved_rgn->flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
414
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
415 if (reserved_rgn->same_region(addr, size)) {
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
416 return _reserved_regions->remove(rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
417 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
418 assert(reserved_rgn->contain_region(addr, size), "Not completely contained");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
419 if (reserved_rgn->base() == addr ||
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
420 reserved_rgn->end() == addr + size) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
421 reserved_rgn->exclude_region(addr, size);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
422 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
423 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
424 address top = reserved_rgn->end();
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
425 address high_base = addr + size;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
426 ReservedMemoryRegion high_rgn(high_base, top - high_base,
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
427 *reserved_rgn->call_stack(), reserved_rgn->flag());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
428
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
429 // use original region for lower region
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
430 reserved_rgn->exclude_region(addr, top - addr);
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
431 LinkedListNode<ReservedMemoryRegion>* new_rgn = _reserved_regions->add(high_rgn);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
432 if (new_rgn == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
433 return false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
434 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
435 reserved_rgn->move_committed_regions(addr, *new_rgn->data());
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
436 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
437 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
438 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
439 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
440 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
441
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
442
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
443 bool VirtualMemoryTracker::walk_virtual_memory(VirtualMemoryWalker* walker) {
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
444 assert(_reserved_regions != NULL, "Sanity check");
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
445 ThreadCritical tc;
20553
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
446 // Check that the _reserved_regions haven't been deleted.
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
447 if (_reserved_regions != NULL) {
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
448 LinkedListNode<ReservedMemoryRegion>* head = _reserved_regions->head();
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
449 while (head != NULL) {
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
450 const ReservedMemoryRegion* rgn = head->peek();
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
451 if (!walker->do_allocation_site(rgn)) {
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
452 return false;
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
453 }
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
454 head = head->next();
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
455 }
20553
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
456 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
457 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
458 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
459
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
460 // Transition virtual memory tracking level.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
461 bool VirtualMemoryTracker::transition(NMT_TrackingLevel from, NMT_TrackingLevel to) {
20553
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
462 assert (from != NMT_minimal, "cannot convert from the lowest tracking level to anything");
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
463 if (to == NMT_minimal) {
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
464 assert(from == NMT_summary || from == NMT_detail, "Just check");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
465 // Clean up virtual memory tracking data structures.
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
466 ThreadCritical tc;
20553
417e3b8d04c5 8059100: SIGSEGV VirtualMemoryTracker::remove_released_region
coleenp
parents: 20365
diff changeset
467 // Check for potential race with other thread calling transition
20363
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
468 if (_reserved_regions != NULL) {
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
469 delete _reserved_regions;
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
470 _reserved_regions = NULL;
36c9011aaead 8054368: nsk/jdi/VirtualMachine/exit/exit002 crash with detail tracking on (NMT2)
zgu
parents: 20360
diff changeset
471 }
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
472 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
473
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
474 return true;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
475 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
476
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
477