JVM的历史趋势

tec*_*rch 0 java monitoring jvm jmx

是否有可用的开源工具可以监视服务器上的远程JVM进程.

理想情况下,它会通过JMX读取遥测数据并存储到具有漂亮GUI的历史数据库中以显示信息

我想要的关键信息是内存,gc时间,线程,类等

the*_*dor 5

JDK提供两个图形工具来监控性能 -

  • jVisualVM和
  • JConsole的

它们都位于JDK的bin目录中.

不幸的是,它们都不允许以编程方式定期保存快照,也不提供可用于编写脚本的命令行版本.

一个好的开源解决方案是jmxmonitor

JMX Monitor Project提供了一个守护程序(或命令行)工具来监视一系列JMX服务.

这些输出到滚动日志文件以供外部工具(例如Nagios或Cacti)处理.

另一个选择是Zabbix:

Zabbix是监控网络的众多参数以及服务器的健康和完整性的软件.Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报.这样可以快速响应服务器问题.Zabbix基于存储的数据提供出色的报告和数据可视化功能.这使得Zabbix成为容量规划的理想选择.

但是,如果您对直接访问数据库的"基本数据记录"感兴趣,那么编写自己的数据库是最好的解决方案 - 特别是如果您想要监视多个虚拟机 - 并且它并不是非常困难,请参阅:通过监视远程虚拟机平台服务器使用JMX进行监视和管理

例:

final JMXServiceURL address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + SERVER_JMXPORT + "/jmxrmi");
final String[] credentials = new String[] { ADMIN, PASSWORD };
final Map<String, String[]> props = new HashMap<String, String[]>();
props.put("jmx.remote.credentials", credentials);

final JMXConnector connector = JMXConnectorFactory.connect(address, props);
final MBeanServerConnection mbs = connector.getMBeanServerConnection();

//Show the name and the state of all the threads
final ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
final long[] threadIDs = threadBean.getAllThreadIds();
final ThreadInfo[] threadDataset = threadBean.getThreadInfo(threadIDs);
for (final ThreadInfo threadData : threadDataset) {
    if (threadData != null) {
        System.out.println(threadData.getThreadName() + " " + threadData.getThreadState());
    }
}
System.out.println();
System.out.println("Current: " + threadBean.getThreadCount() + " peak " + threadBean.getPeakThreadCount());
Run Code Online (Sandbox Code Playgroud)

一旦将数据存储在数据库中,就有大量工具以图形格式表示数据以进行分析.