blob: bb8e06f08e126f76d59a44f952eab39736e7993c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * - Neither the name of Sun Microsystems nor the names of its
16 * contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 */
34
35import javax.management.*;
36import javax.management.remote.*;
37import java.io.IOException;
38import java.net.MalformedURLException;
39
40/**
41 * This VerboseGC class demonstrates the capability to get
42 * the garbage collection statistics and memory usage remotely.
43 */
44public class VerboseGC {
45 private MBeanServerConnection server;
46 private JMXConnector jmxc;
47 public VerboseGC(String hostname, int port) {
48 System.out.println("Connecting to " + hostname + ":" + port);
49
50 // Create an RMI connector client and connect it to
51 // the RMI connector server
52 String urlPath = "/jndi/rmi://" + hostname + ":" + port + "/jmxrmi";
53 connect(urlPath);
54 }
55
56 public void dump(long interval, long samples) {
57 try {
58 PrintGCStat pstat = new PrintGCStat(server);
59 for (int i = 0; i < samples; i++) {
60 pstat.printVerboseGc();
61 try {
62 Thread.sleep(interval);
63 } catch (InterruptedException e) {
64 System.exit(1);
65 }
66 }
67 } catch (IOException e) {
68 System.err.println("\nCommunication error: " + e.getMessage());
69 System.exit(1);
70 }
71 }
72
73 /**
74 * Connect to a JMX agent of a given URL.
75 */
76 private void connect(String urlPath) {
77 try {
78 JMXServiceURL url = new JMXServiceURL("rmi", "", 0, urlPath);
79 this.jmxc = JMXConnectorFactory.connect(url);
80 this.server = jmxc.getMBeanServerConnection();
81 } catch (MalformedURLException e) {
82 // should not reach here
83 } catch (IOException e) {
84 System.err.println("\nCommunication error: " + e.getMessage());
85 System.exit(1);
86 }
87 }
88
89 public static void main(String[] args) {
90 if (args.length < 1) {
91 usage();
92 }
93
94 String hostname = "";
95 int port = -1;
96 long interval = 5000; // default is 5 second interval
97 long mins = 5;
98 for (int argIndex = 0; argIndex < args.length; argIndex++) {
99 String arg = args[argIndex];
100 if (args[argIndex].startsWith("-")) {
101 if (arg.equals("-h") ||
102 arg.equals("-help") ||
103 arg.equals("-?")) {
104 usage();
105 } else if (arg.startsWith("-interval=")) {
106 try {
107 interval = Integer.parseInt(arg.substring(10)) * 1000;
108 } catch (NumberFormatException ex) {
109 usage();
110 }
111 } else if (arg.startsWith("-duration=")) {
112 try {
113 mins = Integer.parseInt(arg.substring(10));
114 } catch (NumberFormatException ex) {
115 usage();
116 }
117 } else {
118 // Unknown switch
119 System.err.println("Unrecognized option: " + arg);
120 usage();
121 }
122 } else {
123 String[] arg2 = arg.split(":");
124 if (arg2.length != 2) {
125 usage();
126 }
127 hostname = arg2[0];
128 try {
129 port = Integer.parseInt(arg2[1]);
130 } catch (NumberFormatException x) {
131 usage();
132 }
133 if (port < 0) {
134 usage();
135 }
136 }
137 }
138
139 // get full thread dump and perform deadlock detection
140 VerboseGC vgc = new VerboseGC(hostname, port);
141 long samples = (mins * 60 * 1000) / interval;
142 vgc.dump(interval, samples);
143
144 }
145
146 private static void usage() {
147 System.out.print("Usage: java VerboseGC <hostname>:<port> ");
148 System.out.println(" [-interval=seconds] [-duration=minutes]");
149 }
150}