blob: d262439ec944a1cd288615a25a984d3c590245ee [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.sampler;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
/**
* Support for sampling from command line
*
* @author Tomas Hurka, Jaroslav Tulach
*
*/
class CLISampler extends Sampler {
private final ThreadMXBean threadMXBean;
private final File output;
public static void main(String... args) throws Exception {
if (args.length != 2) {
System.out.println("Usage: <port> <snapshot.npss>");
System.out.println();
System.out.println("First of all start your application with following parameters:");
System.out.println(" -Dcom.sun.management.jmxremote.authenticate=false");
System.out.println(" -Dcom.sun.management.jmxremote.ssl=false");
System.out.println(" -Dcom.sun.management.jmxremote.port=<port>");
System.out.println("Then you can start this sampler with correct port and file to write snapshot to.");
System.exit(1);
}
if (!SamplesOutputStream.isSupported()) {
System.err.println("Sampling is not supported by JVM");
System.exit(2);
}
String u = args[0];
try {
u = "service:jmx:rmi:///jndi/rmi://localhost:" + Integer.parseInt(args[0]) + "/jmxrmi";
} catch (NumberFormatException ex) {
// OK, use args[0]
}
System.err.println("Connecting to " + u);
JMXServiceURL url = new JMXServiceURL(u);
JMXConnector jmxc = null;
Exception ex = null;
for (int i = 0; i < 100; i++) {
try {
jmxc = JMXConnectorFactory.connect(url, null);
break;
} catch (IOException e) {
ex = e;
System.err.println("Connection failed. Will retry in 300ms.");
Thread.sleep(300);
}
}
if (jmxc == null) {
ex.printStackTrace();
System.err.println("Cannot connect to " + u);
System.exit(3);
}
MBeanServerConnection server = jmxc.getMBeanServerConnection();
final ThreadMXBean threadMXBean = ManagementFactory.newPlatformMXBeanProxy(
server, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
final File output = new File(args[1]);
CLISampler s = new CLISampler(threadMXBean, output);
s.start();
System.out.println("Press enter to generate sample into " + output);
System.in.read();
s.stop();
System.out.println();
System.out.println("Sample written to " + output);
System.exit(0);
}
CLISampler(ThreadMXBean threadBean, File out) {
super("CLISampler");
threadMXBean = threadBean;
output = out;
}
@Override
protected ThreadMXBean getThreadMXBean() {
return threadMXBean;
}
@Override
protected void saveSnapshot(byte[] arr) throws IOException {
try (FileOutputStream os = new FileOutputStream(output)) {
os.write(arr);
}
}
@Override
protected void printStackTrace(Throwable ex) {
ex.printStackTrace();
System.exit(2);
}
@Override
protected void openProgress(int steps) {
}
@Override
protected void closeProgress() {
}
@Override
protected void progress(int i) {
System.out.print("#");
System.out.flush();
}
}