2016-03-01 33 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