/
MemUseTrackerImpl.java
145 lines (121 loc) · 3.83 KB
/
MemUseTrackerImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.graalvm.compiler.debug.internal;
import static org.graalvm.compiler.debug.DebugCloseable.VOID_CLOSEABLE;
import org.graalvm.compiler.debug.Debug;
import org.graalvm.compiler.debug.DebugCloseable;
import org.graalvm.compiler.debug.DebugMemUseTracker;
import org.graalvm.compiler.debug.Management;
import org.graalvm.compiler.debug.internal.method.MethodMetricsImpl;
public class MemUseTrackerImpl extends AccumulatedDebugValue implements DebugMemUseTracker {
private final boolean intercepting;
public static long getCurrentThreadAllocatedBytes() {
return Management.getCurrentThreadAllocatedBytes();
}
/**
* Records the most recent active tracker.
*/
private static final ThreadLocal<CloseableCounterImpl> currentTracker = new ThreadLocal<>();
public MemUseTrackerImpl(String name, boolean conditional, boolean intercepting) {
super(name, conditional, new DebugValue(name + "_Flat", conditional) {
@Override
public String toString(long value) {
return valueToString(value);
}
@Override
public String rawUnit() {
return "B";
}
@Override
public String toRawString(long value) {
return Long.toString(value);
}
});
this.intercepting = intercepting;
}
@Override
public DebugCloseable start() {
if (!isConditional() || Debug.isMemUseTrackingEnabled()) {
CloseableCounterImpl result = intercepting ? new MemUseInterceptingCloseableCounterImpl(this) : new MemUseCloseableCounterImpl(this);
currentTracker.set(result);
return result;
} else {
return VOID_CLOSEABLE;
}
}
public static String valueToString(long value) {
return String.format("%d bytes", value);
}
@Override
public String toString(long value) {
return valueToString(value);
}
private static final class MemUseCloseableCounterImpl extends CloseableCounterImpl implements DebugCloseable {
private MemUseCloseableCounterImpl(AccumulatedDebugValue counter) {
super(currentTracker.get(), counter);
}
@Override
long getCounterValue() {
return getCurrentThreadAllocatedBytes();
}
@Override
public void close() {
super.close();
currentTracker.set(parent);
}
}
private static final class MemUseInterceptingCloseableCounterImpl extends CloseableCounterImpl implements DebugCloseable {
private MemUseInterceptingCloseableCounterImpl(AccumulatedDebugValue counter) {
super(currentTracker.get(), counter);
}
@Override
long getCounterValue() {
return getCurrentThreadAllocatedBytes();
}
@Override
public void close() {
super.close();
currentTracker.set(parent);
}
@Override
protected void interceptDifferenceAccm(long difference) {
if (Debug.isMethodMeterEnabled()) {
MethodMetricsImpl.addToCurrentScopeMethodMetrics(counter.getName(), difference);
}
}
@Override
protected void interceptDifferenceFlat(long difference) {
if (Debug.isMethodMeterEnabled()) {
MethodMetricsImpl.addToCurrentScopeMethodMetrics(counter.flat.getName(), difference);
}
}
}
@Override
public String rawUnit() {
return "B";
}
@Override
public String toRawString(long value) {
return Long.toString(value);
}
}