是否可以使用命令行中的JMX在linux(CentOS)上运行的进程上获取服务器堆转储?
无法打开VisualVM,无法安装jmap
这不会很漂亮,但很管用。话虽如此,您可能想考虑在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]参数提供凭据。
可以通过以下简单代码完成:
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能否支持命令行进行堆转储?或者除了