annotate src/share/vm/utilities/nativeCallStack.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents c6211b707068
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) 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
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
25 #include "precompiled.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
26 #include "runtime/os.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
27 #include "utilities/globalDefinitions.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
28 #include "utilities/nativeCallStack.hpp"
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
29
20364
c6211b707068 8055007: NMT2: emptyStack missing in minimal build
zgu
parents: 20360
diff changeset
30 const NativeCallStack NativeCallStack::EMPTY_STACK(0, false);
20360
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
31
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
32 NativeCallStack::NativeCallStack(int toSkip, bool fillStack) :
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
33 _hash_value(0) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
34
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
35 #if !PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
36 fillStack = false;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
37 #endif
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
38
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
39 if (fillStack) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
40 os::get_native_stack(_stack, NMT_TrackingStackDepth, toSkip);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
41 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
42 for (int index = 0; index < NMT_TrackingStackDepth; index ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
43 _stack[index] = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
44 }
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
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
48 NativeCallStack::NativeCallStack(address* pc, int frameCount) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
49 int frameToCopy = (frameCount < NMT_TrackingStackDepth) ?
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
50 frameCount : NMT_TrackingStackDepth;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
51 int index;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
52 for (index = 0; index < frameToCopy; index ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
53 _stack[index] = pc[index];
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
54 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
55 for (; index < NMT_TrackingStackDepth; index ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
56 _stack[index] = NULL;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
57 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
58 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
59
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
60 // number of stack frames captured
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
61 int NativeCallStack::frames() const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
62 int index;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
63 for (index = 0; index < NMT_TrackingStackDepth; index ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
64 if (_stack[index] == NULL) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
65 break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
66 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
67 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
68 return index;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
69 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
70
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
71 // Hash code. Any better algorithm?
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
72 int NativeCallStack::hash() const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
73 long hash_val = _hash_value;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
74 if (hash_val == 0) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
75 long pc;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
76 int index;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
77 for (index = 0; index < NMT_TrackingStackDepth; index ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
78 pc = (long)_stack[index];
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
79 if (pc == 0) break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
80 hash_val += pc;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
81 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
82
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
83 NativeCallStack* p = const_cast<NativeCallStack*>(this);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
84 p->_hash_value = (int)(hash_val & 0xFFFFFFFF);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
85 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
86 return _hash_value;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
87 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
88
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
89 void NativeCallStack::print_on(outputStream* out) const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
90 print_on(out, 0);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
91 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
92
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
93 // Decode and print this call path
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
94 void NativeCallStack::print_on(outputStream* out, int indent) const {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
95 address pc;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
96 char buf[1024];
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
97 int offset;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
98 if (is_empty()) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
99 for (int index = 0; index < indent; index ++) out->print(" ");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
100 #if PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
101 out->print("[BOOTSTRAP]");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
102 #else
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
103 out->print("[No stack]");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
104 #endif
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
105 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
106 for (int frame = 0; frame < NMT_TrackingStackDepth; frame ++) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
107 pc = get_frame(frame);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
108 if (pc == NULL) break;
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
109 // Print indent
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
110 for (int index = 0; index < indent; index ++) out->print(" ");
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
111 if (os::dll_address_to_function_name(pc, buf, sizeof(buf), &offset)) {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
112 out->print_cr("[" PTR_FORMAT "] %s+0x%x", p2i(pc), buf, offset);
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
113 } else {
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
114 out->print_cr("[" PTR_FORMAT "]", p2i(pc));
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
115 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
116 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
117 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
118 }
833b0f92429a 8046598: Scalable Native memory tracking development
zgu
parents:
diff changeset
119