在日常项目运作中,有时我们需要将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); } }
相关推荐
4. "jvm-monitor-master":此项目可能是一个定制化的JVM监控解决方案,具体功能需查看源代码和文档以了解详情。 三、JVM调优实践 1. 堆内存调整:根据应用的内存需求,合理设定堆大小,避免Full GC频繁发生。 2. ...
JVM监控代理 监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of ...
`jconsole`是一个图形化的JVM监控工具,可以实时查看内存、线程、类加载等信息,以及进行简单的性能调整。`jvisualvm`是另一个强大的多合一工具,除了基本的监控功能,还支持CPU和内存分析、线程快照、远程连接等。`...
JVM Monitor是一个实用工具,专门设计用于监控JVM的运行状态,帮助开发者检测JVM的使用情况,以便优化代码性能、诊断问题和确保应用的稳定运行。 1. **内存监控** - **堆内存**:JVM Monitor可以显示堆内存的使用...
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监控**:JVMM可以实时监控JVM的内存使用情况,包括堆内存、非堆内存、垃圾收集器的状态等。它还能显示线程信息,如线程数量、状态和CPU占用。 - **性能指标**:JVMM提供了CPU使用率、系统负载、磁盘I/O、...
大家还在愁JVM,CPU等监控无门吗?对于分布式环境怎么样监控呢?,小型机器人替你搞定一切!redis-monitor 是一个nredis-proxy 的小型机器人,可以监控redisServer,nredis-proxy,jvm ,cpu等;具有failover功能!
首先,你需要下载并解压 dubbo-monitor 的压缩包,例如这里提供的 "dubbo-monitor-simple-2.5.10"。这个版本号表明这是 Dubbo Monitor 简单版的2.5.10版本,可能包含了基础的监控功能。解压后,你需要对配置文件进行...
【标题】"Druid Monitor监控数据源和慢查询,还可以监控Web应用、URI监控、Session监控、Spring监控.zip" 提供了关于如何在SpringBoot应用中集成并利用Druid监控工具进行性能优化和问题排查的知识点。Druid是一个...
- **MONITORTIME**:监控线程争夺进入监视器所花费的时间,排名基于总监控争用时间。 - **MONITORDUMP**:提供系统中所有监视器和线程的完整快照。 #### hprof文件的生成与获取 hprof文件通常在程序退出时自动生成...
脚本调用: ./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_...
这里需要注意,app-monitor是对监控手段的一种补充,将应用需要对外展示的数据与外部的监控系统进行关联,另外,JVM的监控也是应用监控的一部分,但是这部分的监控因为JVM提供RMI的方式可以从外部进行监控,所以不...
5. **JVM监控**:监控每个节点的Java虚拟机状态,包括堆内存使用、垃圾收集情况等,这对于调整JVM参数以提高性能很有用。 6. **告警管理**:设置和查看告警规则,当特定条件满足时,如节点失联、任务失败等,系统会...
6. **JVM监控**:Java虚拟机(JVM)的监控也是关键,包括堆内存、非堆内存、GC(垃圾收集)行为等。通过JConsole、VisualVM或更高级的工具如JProfiler、YourKit,可以深入理解JVM的运行情况。 7. **分布式追踪**:...
IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 ...等待监控器检查资源,Waiting on monitor 5.暂停,Suspended 6.对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8.停止,Parked
【文件名称列表】"tomee-env-monitor-master" 表明这是项目的主分支或源代码库,可能包含了项目的源码、配置文件、构建脚本和其他相关资源。 在深入讨论此应用时,我们可以关注以下几个关键知识点: 1. **JAX-RS**...
- **方法执行监控:** `monitor` - **方法执行数据观测:** `watch` - **方法内部调用路径:** `trace` - **输出当前方法调用路径:** `stack` - **方法执行数据时空隧道:** `tt` - 注意事项:这些命令通过字节码...
简介项目介绍基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用该项目是借鉴另个一开源项目JavaMonito初始版演变而来,剔除了一些功能,增加了可远程监控模块,只需要在需要监控的项目集成...
因此,实时监控JVM内存用量可以帮助开发者及时发现并解决潜在的性能问题。 要实现这个功能,通常需要以下步骤: 1. **安装插件**:Eclipse有一个名为Memory Analyzer Tool (MAT)的内置工具,用于分析内存泄漏。...
IBM Thread and Monitor Dump Analyzer (TMDA) 是一个专门用于分析Java应用程序的线程和监控器转储的工具。在Java应用开发和运维过程中,线程 dump 是诊断和解决性能问题、死锁、线程阻塞等关键问题的重要手段。TMDA...