在日常项目运作中,有时我们需要将JVM的信息以我们期望的方式输出到日志中,然后对日志对日志进行实时监控。
1.JVM监控日志
#jvm-monitor-digest.log#
说明:记录了jvm中的一些堆内存和线程信息以及堆外内存,例
2014-07-10 00:00:06,599 INFO JVM INFO - (1325.5,5390)(7.4,135,614,3601)(5.46,5390) 2014-07-10 00:00:36,599 INFO JVM INFO - (1745.07,5390)(7.4,135,614,3601)(5.46,5390)
格式:(used_heap,max_heap)(current_thread_cpu_time,daemon_thread_count,total_thread_count,total_started_thread_count)(non_heap_reserved_memory,non_heap_max_memory)
2.实现原理
创建一个守护线程定时(每隔30s)统计堆内存,线程信息,堆外内存,并输出。
堆内存信息:
直接使用java内存管理Bean MemoryMXBean获取堆内存信息。
MemoryMXBean获取方法:
private static final MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
线程信息:
直接使用java线程管理Bean ThreadMXBean获取堆内存信息。
MemoryMXBean获取方法:
private static final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
格式:(used_heap,max_heap)(current_thread_cpu_time,daemon_thread_count,total_thread_count,total_started_thread_count)(non_heap_reserved_memory,non_heap_max_memory)
堆外内存:
这里是指狭义的堆外内存,是指java.nio.DirectByteBuffer在创建的时候分配的内存,也叫Direct memory。堆外内存信息可以通过反射获取java.nio.Bits对应的字段maxMemory和reservedMemory,注意这两个字段的单位是bytes。
http://www.open-open.com/lib/view/open1431570358826.html
代码
public class JvmMonitor { protected static final Log logger = LogFactory.getLog("jvm-monitor-digest"); private static final String SPLITTER = ","; private static final DecimalFormat decimalformat = new DecimalFormat("#.##"); private static final MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); private static final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); private static Field maxDirectedMemoryField; private static Field reservedDirectedMemoryField; public JvmMonitor() throws Exception { Class clz = Class.forName("java.nio.Bits"); maxDirectedMemoryField = clz.getDeclaredField("maxMemory"); maxDirectedMemoryField.setAccessible(true); reservedDirectedMemoryField = clz.getDeclaredField("reservedMemory"); reservedDirectedMemoryField.setAccessible(true); } public void start() { Thread monitor = new Thread() { public void run() { try { while (true) { JvmMonitor.logger.info(JvmMonitor.this.getJVMInfo()); sleep(30000L); } } catch (Exception e) { e.printStackTrace(); } } }; monitor.setDaemon(true); monitor.setName("JVM INFO"); monitor.start(); } private String getJVMInfo() { MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); StringBuilder sb = new StringBuilder(); sb.append("("); sb.append(formatValue(memoryUsage.getUsed())).append(","); sb.append(formatValue(memoryUsage.getMax())); sb.append(")"); sb.append("("); sb.append(formatNanosecond(threadMXBean.getCurrentThreadCpuTime())).append(","); sb.append(threadMXBean.getDaemonThreadCount()).append(","); sb.append(threadMXBean.getThreadCount()).append(","); sb.append(threadMXBean.getTotalStartedThreadCount()); sb.append(")"); sb.append(getDirectedMemoryInfo()); return sb.toString(); } private String getDirectedMemoryInfo() { StringBuilder sb = new StringBuilder(); Long maxMemoryValue = Long.valueOf(0L); Long reservedMemoryValue = Long.valueOf(0L); try { maxMemoryValue = (Long)maxDirectedMemoryField.get(null); reservedMemoryValue = (Long)reservedDirectedMemoryField.get(null); } catch (Exception e) { } sb.append("("); sb.append(formatValue(reservedMemoryValue.longValue())); sb.append(","); sb.append(formatValue(maxMemoryValue.longValue())); sb.append(")"); return sb.toString(); } private static String formatValue(long value) { Double tempValue = Double.valueOf(new Double(value).doubleValue() / 1024.0D / 1024.0D); return decimalformat.format(tempValue); } private String formatNanosecond(long value) { Double tempValue = Double.valueOf(new Double(value).doubleValue() / 1000000000.0D); return decimalformat.format(tempValue); } }
相关推荐
Java性能监控与调优Demo,主要学习各种JDK监控工具以及jvm调优-monitor_tuning_Demo
JVM监控代理 监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of ...
jvm-top lets you monitor your JVM server applications from the terminal. Install Requirement: a JDK8 on the server and JAVA_HOME environment variable pointing to it. It won't work with just a JRE. ...
大家还在愁JVM,CPU等监控无门吗?对于分布式环境怎么样监控呢?,小型机器人替你搞定一切!redis-monitor 是一个nredis-proxy 的小型机器人,可以监控redisServer,nredis-proxy,jvm ,cpu等;具有failover功能!
JVMM(JVM Monitor)是一个提供Java虚拟机和操作系统服务式监控的工具,拥有丰富的数据采-jvmm
这里需要注意,app-monitor是对监控手段的一种补充,将应用需要对外展示的数据与外部的监控系统进行关联,另外,JVM的监控也是应用监控的一部分,但是这部分的监控因为JVM提供RMI的方式可以从外部进行监控,所以不...
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 ...等待监控器检查资源,Waiting on monitor 5.暂停,Suspended 6.对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8.停止,Parked
脚本调用: ./tomcat_monitor -u admin -p admin -h 127.0.0.1 -P 8080 返回信息: { "static_tomcat_version":8, "tomcat_server_status":1, "application0":{ "status":"running", "path":"/app1", "active_...
简介项目介绍基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用该项目是借鉴另个一开源项目JavaMonito初始版演变而来,剔除了一些功能,增加了可远程监控模块,只需要在需要监控的项目集成...
### 1。服务端端口明细 报名人数:8100 通过认证:8200 by-gateway 8201#网关... 由monitor-admin 8501 SBA服务 项目持续维护中 注意如果项目clone下来不自动加载编译,请操作->选着按平台->快捷添加为Maven Project
jvm参数类型:alien: jinfo & jps(参数和进程查看):alien: jstat(类加载、垃圾收集、JIT 编译):alien: jmap+MAT(内存溢出):alien: jstack(线程、死循环、死锁):alien: JVisualVM(本地和远程可视化监控:alien: 使用 ...
该项目为 Java探针 运行前提是 有Jvm环境,集成了Swagger接口 场景: 在没有使用 分布式的项目,进行集群管理时,有时候来了做服务器监控的需求 如果没有特殊要求 阿里开源的 Arthas 是非常好用的java诊断工具 但是 ...
monitor-group: kafka的监控消费组,app在日志中进行各种event埋点(如:第三方异常报警、请求耗时异常报警等) business-group: kafka的业务消费组 trace-group: 通过日志进行rpc调用trace跟踪(dapper论文) es: ...
1.编写Shell脚本monitor.sh #!/bin/sh # func:自动监控tomcat脚本并且执行重启操作 # author:EagleHao # date:2018-04-08 # DEFINE # 获取tomcat进程ID(其中[grep -w 'tomcat']代码中的tomcat需要替换为你的tomcat...
该项目为 Java探针 运行前提是 有Jvm环境,集成了Swagger接口 **场景:** 在没有使用 **分布式**的项目,进行集群管理时,有时候来了做服务器监控的需求 如果没有特殊要求 阿里开源的 ```Arthas``` 是非常好用...
方法执行监控(调用量,成功失败率,响应时间) 方法执行数据观测(参数,返回结果,异常信息等) 方法执行数据记录 性能开销渲染 方法执行数据自定义观测...
#Java Koans ...lib/file-monitor : 文件监控模块,用于在文件保存时通知应用程序 lib/util :项目中共享的与应用程序无关的接口和实用程序 将目录切换到 koans 目录: cd koans 如果您使用的是 W
处理JVM NIO Bug Rewrite模块 Inversion of Control and Dependency Injection Frameworks Jetty XML IOC 如何使用Spring来配置Jetty 如何使用XBean来配置Jetty 客户端 Asynchronous HTTP Client教程 日志 / 监控 ...
lib : 执行 koans 的引擎的源代码目录lib/koans-tests :用于检查应用程序健全性的测试目录lib/file-compiler :动态编译器模块,将新保存的 java 文件作为类加载到 JVM 中lib/file-monitor : 文件监控模块,用于在...
它只需要支持监视模式的JVM和WiFi适配器。 可以将其想象成一个长期(数月或数年)的分布式Wireshark / tcpdump,可以使用功能强大的UI进行实时分析和过滤。 如果您不熟悉WiFi安全性的魅力,则可能需要阅读我的...