我们正在监视jvm指标,如堆、元数据库、线程和gc计数,我们能够将这些指标推送到像Prometheus一样的monitorng服务器。类似地,我们希望跟踪Java本地内存指标(jcmd vm.sumary的输出)。我的问题是,是否可以通过调用任何jvm运行时类来获得这些度量?
是的,可以直接从Java应用程序获取NativeMemoryTracking摘要:
import javax.management.JMException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class DiagnosticCommand {
public static String execute(String command, String... args) throws JMException {
return (String) ManagementFactory.getPlatformMBeanServer().invoke(
new ObjectName("com.sun.management:type=DiagnosticCommand"),
command,
new Object[]{args},
new String[]{"[Ljava.lang.String;"});
}
public static void main(String[] args) throws Exception {
String summary = DiagnosticCommand.execute("vmNativeMemory", "summary");
System.out.println(summary);
}
}
不过,您必须解析文本输出。
注意,NMT报告中最重要的部分可以用指定的MBeans单独跟踪,包括
正如我在评论中所说的,监视NMT输出在实践中并不总是有帮助的,因为它不能直接反映进程使用的实际物理内存。NMT可以报告比实际使用少得多的内存,或者从OS的角度来看,它也可以报告比进程消耗多得多的内存。
由于NMT会忽略Java进程消耗的大量OS内存,因此监视进程的驻留集大小(RSS)也很有用。在Linux上,这可以通过解析/proc/[pid]/stat
或/proc/[pid]/status
来完成。
问题内容: 我目前正在测试将密钥插入数据库Redis(在本地)中。我有超过500万个密钥,而且我只有4GB的RAM,所以一时我达到了RAM的容量并交换了数据(并且我的PC掉了)。 我的问题是:如何在具有Redis数据库的计算机上监视内存使用情况,并以此方式发出警报,不再在Redis数据库中插入某些密钥? 谢谢。 问题答案: 关于内存使用情况,建议您查看redis.io 常见问题解答以及有关将red
问题内容: 我是第一次安装在操作系统上。我也安装了。我安装过程的下一步是安装。这一切都很好。 但是,当我 在命令行输入内容运行时,出现以下错误… rs 节点app.js 在错误下方的命令行中… 为什么会这样呢?这是nodemon的正常行为吗?如果没有,我该如何解决? 旁注… 1)是其中包含的文件。 2)版本是 3)版本是 4)版本是 5)版本是… 问题答案: 看来我的最大端口配置不正确。我运行了以
问题内容: 我正在编写一个bash脚本,我想监视文件在目录中的更改(添加,删除和重命名),并相应地执行不同的操作。 有没有一种方法可以直接从我的脚本中执行此操作(除了定期创建目录和make之外)? 问题答案: 您可以使用以下命令(假设您的发行版支持inotify,大多数情况下这样做):
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可实时动态监视操作系统的虚拟内存、进程、CPU活动。 10.1. vmstat的语法 vmstat [-V] [-n] [delay [count]] - -V表示打印出版本信息;- -n表示在周期性循环输出时,输出的头部信息仅显示一次;- delay是两次输出之间的延迟时间;- count是指按照这个时
Java虚拟机在执行的时候会把管理的内存分配到不同的区域,这些区域称为虚拟机内存;同时对于虚拟机没有直接管理的物理内存,也会有一定的利用,这些被利用但不在虚拟机内存的地方称为本地内存。 JVM内存:受虚拟机内存大小的参数控制,当大小超过参数设置的大小时会报OOM。 本地内存:本地内存不受虚拟机内存参数的限制,只受物理内存容量的限制;虽然不受参数的限制,如果所占内存超过物理内存,仍然会报OOM。 虚