2016-03-01 37 views

回答

0

这会不会是漂亮,但它的工作原理。话虽如此,你可能想要考虑在Groovy或Jython中编写脚本,甚至是JavaScript ...... 我为jmxlocal添加了一个quickie插件,这是一个为本地JVM实现标准JMX远程处理的项目。它现在支持命令行针对连接的MBeanServer调用一个命令,并且该命令必须在Java代码中指定。

克隆回购和建立与mvn干净安装。 将jar(jmxlocal-1.0-SNAPSHOT.jar)复制到目标服务器。如下 执行使用目标java进程的PID转储JMX命令:

java -jar target/jmxlocal-1.0-SNAPSHOT.jar -j service:jmx:attach:///<PID> -c "conn.invoke(on(\"com.sun.management:type=HotSpotDiagnostic\"), \"dumpHeap\", new Object[]{\"/tmp/heap.dump\", true}, new String[]{String.class.getName(), boolean.class.getName()})" 

输出将是

Command Executed. Result [null] 

,你应该在/tmp/heap.dump找到你的转储文件

如果需要,你可以提供使用-u [用户名]-p [密码]参数凭据。

+0

'了java.lang.RuntimeException:无法找到Atach API。请将tools.jar添加到类路径中。有任何想法吗 ? – Nati

+0

如果您使用的JRE(而不是JDK)没有** tools.jar **,通常会发生这种情况。该jar可以在** $ JDK_HOME **/lib中找到。 – Nicholas

+0

那么我该如何解决它?我显然在目标服务器上没有JDK。我试图在java旁边复制tools.jar,但仍然没有成功。 – Nati

1

它可以用这个简单的代码来完成:

@SuppressWarnings("restriction") 
public class CreateHeapDump 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String host = args[0]; 
     String port = args[1]; 

     JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"); 
     JMXConnector jmxc = JMXConnectorFactory.connect(url, null); 
     MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); 
     ObjectName mbeanName = new ObjectName("com.sun.management:type=HotSpotDiagnostic"); 
     HotSpotDiagnosticMXBean bean = JMX.newMBeanProxy(mbsc, mbeanName, HotSpotDiagnosticMXBean.class, true); 

     String fileName = "heap_dump_" + new SimpleDateFormat("dd.MM.yyyy HH.mm").format(new Date()) + ".hprof"; 
     boolean onlyLiveObjects = true; 
     bean.dumpHeap(fileName, onlyLiveObjects); 
    } 
} 

调用它的命令行:

java CreateHeapDump localhost 9010