Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/classes/sun/tools/jstat/Jstat.java
38918 views
1
/*
2
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
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. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package sun.tools.jstat;
27
28
import java.util.*;
29
import sun.jvmstat.monitor.*;
30
import sun.jvmstat.monitor.event.*;
31
32
/**
33
* Application to output jvmstat statistics exported by a target Java
34
* Virtual Machine. The jstat tool gets its inspiration from the suite
35
* of 'stat' tools, such as vmstat, iostat, mpstat, etc., available in
36
* various UNIX platforms.
37
*
38
* @author Brian Doherty
39
* @since 1.5
40
*/
41
public class Jstat {
42
private static Arguments arguments;
43
44
public static void main(String[] args) {
45
try {
46
arguments = new Arguments(args);
47
} catch (IllegalArgumentException e) {
48
System.err.println(e.getMessage());
49
Arguments.printUsage(System.err);
50
System.exit(1);
51
}
52
53
if (arguments.isHelp()) {
54
Arguments.printUsage(System.out);
55
System.exit(0);
56
}
57
58
if (arguments.isOptions()) {
59
OptionLister ol = new OptionLister(arguments.optionsSources());
60
ol.print(System.out);
61
System.exit(0);
62
}
63
64
try {
65
if (arguments.isList()) {
66
logNames();
67
} else if (arguments.isSnap()) {
68
logSnapShot();
69
} else {
70
logSamples();
71
}
72
} catch (MonitorException e) {
73
if (e.getMessage() != null) {
74
System.err.println(e.getMessage());
75
} else {
76
Throwable cause = e.getCause();
77
if ((cause != null) && (cause.getMessage() != null)) {
78
System.err.println(cause.getMessage());
79
} else {
80
e.printStackTrace();
81
}
82
}
83
System.exit(1);
84
}
85
System.exit(0);
86
}
87
88
static void logNames() throws MonitorException {
89
VmIdentifier vmId = arguments.vmId();
90
int interval = arguments.sampleInterval();
91
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(vmId);
92
MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval);
93
JStatLogger logger = new JStatLogger(monitoredVm);
94
logger.printNames(arguments.counterNames(), arguments.comparator(),
95
arguments.showUnsupported(), System.out);
96
monitoredHost.detach(monitoredVm);
97
}
98
99
static void logSnapShot() throws MonitorException {
100
VmIdentifier vmId = arguments.vmId();
101
int interval = arguments.sampleInterval();
102
MonitoredHost monitoredHost = MonitoredHost.getMonitoredHost(vmId);
103
MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval);
104
JStatLogger logger = new JStatLogger(monitoredVm);
105
logger.printSnapShot(arguments.counterNames(), arguments.comparator(),
106
arguments.isVerbose(), arguments.showUnsupported(),
107
System.out);
108
monitoredHost.detach(monitoredVm);
109
}
110
111
static void logSamples() throws MonitorException {
112
final VmIdentifier vmId = arguments.vmId();
113
int interval = arguments.sampleInterval();
114
final MonitoredHost monitoredHost =
115
MonitoredHost.getMonitoredHost(vmId);
116
MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmId, interval);
117
final JStatLogger logger = new JStatLogger(monitoredVm);
118
OutputFormatter formatter = null;
119
120
if (arguments.isSpecialOption()) {
121
OptionFormat format = arguments.optionFormat();
122
formatter = new OptionOutputFormatter(monitoredVm, format);
123
} else {
124
List<Monitor> logged = monitoredVm.findByPattern(arguments.counterNames());
125
Collections.sort(logged, arguments.comparator());
126
List<Monitor> constants = new ArrayList<Monitor>();
127
128
for (Iterator i = logged.iterator(); i.hasNext(); /* empty */) {
129
Monitor m = (Monitor)i.next();
130
if (!(m.isSupported() || arguments.showUnsupported())) {
131
i.remove();
132
continue;
133
}
134
if (m.getVariability() == Variability.CONSTANT) {
135
i.remove();
136
if (arguments.printConstants()) constants.add(m);
137
} else if ((m.getUnits() == Units.STRING)
138
&& !arguments.printStrings()) {
139
i.remove();
140
}
141
}
142
143
if (!constants.isEmpty()) {
144
logger.printList(constants, arguments.isVerbose(),
145
arguments.showUnsupported(), System.out);
146
if (!logged.isEmpty()) {
147
System.out.println();
148
}
149
}
150
151
if (logged.isEmpty()) {
152
monitoredHost.detach(monitoredVm);
153
return;
154
}
155
156
formatter = new RawOutputFormatter(logged,
157
arguments.printStrings());
158
}
159
160
// handle user termination requests by stopping sampling loops
161
Runtime.getRuntime().addShutdownHook(new Thread() {
162
public void run() {
163
logger.stopLogging();
164
}
165
});
166
167
// handle target termination events for targets other than ourself
168
HostListener terminator = new HostListener() {
169
public void vmStatusChanged(VmStatusChangeEvent ev) {
170
Integer lvmid = new Integer(vmId.getLocalVmId());
171
if (ev.getTerminated().contains(lvmid)) {
172
logger.stopLogging();
173
} else if (!ev.getActive().contains(lvmid)) {
174
logger.stopLogging();
175
}
176
}
177
178
public void disconnected(HostEvent ev) {
179
if (monitoredHost == ev.getMonitoredHost()) {
180
logger.stopLogging();
181
}
182
}
183
};
184
185
if (vmId.getLocalVmId() != 0) {
186
monitoredHost.addHostListener(terminator);
187
}
188
189
logger.logSamples(formatter, arguments.headerRate(),
190
arguments.sampleInterval(), arguments.sampleCount(),
191
System.out);
192
193
// detach from host events and from the monitored target jvm
194
if (terminator != null) {
195
monitoredHost.removeHostListener(terminator);
196
}
197
monitoredHost.detach(monitoredVm);
198
}
199
}
200
201