当前位置: 首页 > 知识库问答 >
问题:

使用jmx从命令行获取堆转储

钱俊楚
2023-03-14

是否可以使用命令行中的JMX在linux(CentOS)上运行的进程上获取服务器堆转储?

无法打开VisualVM,无法安装jmap

共有2个答案

幸经艺
2023-03-14

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

克隆repo并使用mvn clean install构建。将jar(jmxlocal-1.0-SNAPSHOT.jar)复制到目标服务器。使用目标java进程的PID执行dump 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中找到转储文件。倾倒

如果需要,可以使用-u[username]和-p[password]参数提供凭据。

柯锋
2023-03-14

可以通过以下简单代码完成:

import com.sun.management.HotSpotDiagnosticMXBean;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

@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);
    }
}

编译它:

javac CreateHeapDump.java

从命令行调用:

java CreateHeapDump localhost 9010
 类似资料:
  • GUI和非GUI JMX文件之间有什么区别 为什么我会犯这些错误 我能用Jmeter GUI创建的JMX文件在命令行Jmeter上使用吗 我在我的windows设备上试用了jmeter,效果很好!!现在我想在一些没有GUI的远程服务器(LINUX)上运行它,我尝试使用命令行jmeter 命令: 以下内容摘自

  • 当我试图从UI运行我的jmx文件时,它运行得非常好。 但是,当我尝试使用mvn时, 它开始执行,但在我使用JSON提取器从响应中提取一些值时失败了。下面是我得到的错误, 正如本文所述,我在pom.xml中添加了多个库,但是问题没有得到解决。

  • Gradle提供了许多内置任务来收集构建信息. 这些内置任务对于了解依赖结构以及解决问题都是很有帮助的. 了解更多, 可以参阅项目报告插件以为你的项目添加构建报告

  • 问题内容: 我离开Linode是因为我没有必要的Linux sysadmin技能。在完成向更加友好的服务过渡之前,我需要下载MySQL数据库的内容。有什么办法可以从命令行执行此操作? 问题答案: 您可以使用mysqldump命令行功能完成此操作。 例如: 如果是整个数据库,则: 如果是所有DB,那么: 如果是数据库中的特定表,则: 您甚至可以使用gzip来自动压缩输出(如果您的数据库很大): 如果

  • 我正在远离Linode,因为我没有必要的Linux系统管理员技能;在我完成到一个更友好的noob服务的转换之前,我需要下载一个MySQL数据库的内容。有没有一种方法可以让我从命令行完成这件事?

  • 我们在linux中使用oracle jvm 1.8 64位。 我们知道jmap可以获得jvm堆转储: 但是很慢。 我们知道通过JVisualVM和JConsolar连接到JMX也可以获得堆转储,而且非常快。但是他们有图形用户界面。 然而,在我们的产品环境中,没有GUI。没有一台有GUI的机器可以访问这个环境。 所以我们的问题是-JVisualVM和JConsole能否支持命令行进行堆转储?或者除了