`
Josh_Persistence
  • 浏览: 1649824 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

JVM监控方法 - JvmMonitor

    博客分类:
  • Java
阅读更多

        在日常项目运作中,有时我们需要将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);
  }
}

 

 

分享到:
评论

相关推荐

    jvm调优测试仓库-jvm-monitor.zip

    4. "jvm-monitor-master":此项目可能是一个定制化的JVM监控解决方案,具体功能需查看源代码和文档以了解详情。 三、JVM调优实践 1. 堆内存调整:根据应用的内存需求,合理设定堆大小,避免Full GC频繁发生。 2. ...

    jvm-monitoring-agent:从内部监视JVM,检测线程块并自动保存线程转储

    JVM监控代理 监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of ...

    Java性能监控与调优Demo,主要学习各种JDK监控工具以及jvm调优-monitor_tuning_Demo.zip

    `jconsole`是一个图形化的JVM监控工具,可以实时查看内存、线程、类加载等信息,以及进行简单的性能调整。`jvisualvm`是另一个强大的多合一工具,除了基本的监控功能,还支持CPU和内存分析、线程快照、远程连接等。`...

    JVM Monitor

    JVM Monitor是一个实用工具,专门设计用于监控JVM的运行状态,帮助开发者检测JVM的使用情况,以便优化代码性能、诊断问题和确保应用的稳定运行。 1. **内存监控** - **堆内存**:JVM Monitor可以显示堆内存的使用...

    Android代码-终端实现的 JVM 监视器。

    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. ...

    JVMM(JVM Monitor)是一个提供Java虚拟机和操作系统服务式监控的工具,拥有丰富的数据采-jvmm.zip

    - **JVM监控**:JVMM可以实时监控JVM的内存使用情况,包括堆内存、非堆内存、垃圾收集器的状态等。它还能显示线程信息,如线程数量、状态和CPU占用。 - **性能指标**:JVMM提供了CPU使用率、系统负载、磁盘I/O、...

    redis-monitor-master.zip

    大家还在愁JVM,CPU等监控无门吗?对于分布式环境怎么样监控呢?,小型机器人替你搞定一切!redis-monitor 是一个nredis-proxy 的小型机器人,可以监控redisServer,nredis-proxy,jvm ,cpu等;具有failover功能!

    dubbo-monitor

    首先,你需要下载并解压 dubbo-monitor 的压缩包,例如这里提供的 "dubbo-monitor-simple-2.5.10"。这个版本号表明这是 Dubbo Monitor 简单版的2.5.10版本,可能包含了基础的监控功能。解压后,你需要对配置文件进行...

    Druid Monitor监控数据源和慢查询,还可以监控Web应用、URI监控、Session监控、Spring监控.zip

    【标题】"Druid Monitor监控数据源和慢查询,还可以监控Web应用、URI监控、Session监控、Spring监控.zip" 提供了关于如何在SpringBoot应用中集成并利用Druid监控工具进行性能优化和问题排查的知识点。Druid是一个...

    jvm

    - **MONITORTIME**:监控线程争夺进入监视器所花费的时间,排名基于总监控争用时间。 - **MONITORDUMP**:提供系统中所有监视器和线程的完整快照。 #### hprof文件的生成与获取 hprof文件通常在程序退出时自动生成...

    app-monitor:应用监控模块

    这里需要注意,app-monitor是对监控手段的一种补充,将应用需要对外展示的数据与外部的监控系统进行关联,另外,JVM的监控也是应用监控的一部分,但是这部分的监控因为JVM提供RMI的方式可以从外部进行监控,所以不...

    druid-monitor:基于Druid的监控系统

    5. **JVM监控**:监控每个节点的Java虚拟机状态,包括堆内存使用、垃圾收集情况等,这对于调整JVM参数以提高性能很有用。 6. **告警管理**:设置和查看告警规则,当特定条件满足时,如节点失联、任务失败等,系统会...

    tomcat监控脚本,可获取应用数、日志大小、内存、JVM等信息

    脚本调用: ./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_...

    monitor-boot-starter

    6. **JVM监控**:Java虚拟机(JVM)的监控也是关键,包括堆内存、非堆内存、GC(垃圾收集)行为等。通过JConsole、VisualVM或更高级的工具如JProfiler、YourKit,可以深入理解JVM的运行情况。 7. **分布式追踪**:...

    后端JAVA虚拟机JVM调优必备工具

    IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 ...等待监控器检查资源,Waiting on monitor  5.暂停,Suspended  6.对象等待中,Object.wait()  7.阻塞,Blocked(重点关注)  8.停止,Parked

    tomee-env-monitor

    【文件名称列表】"tomee-env-monitor-master" 表明这是项目的主分支或源代码库,可能包含了项目的源码、配置文件、构建脚本和其他相关资源。 在深入讨论此应用时,我们可以关注以下几个关键知识点: 1. **JAX-RS**...

    Arthas阿尔萨斯使用说明

    - **方法执行监控:** `monitor` - **方法执行数据观测:** `watch` - **方法内部调用路径:** `trace` - **输出当前方法调用路径:** `stack` - **方法执行数据时空隧道:** `tt` - 注意事项:这些命令通过字节码...

    boot-actuator:基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用,支持远程监控

    简介项目介绍基于SpringBoot2.0 实现的jvm远程监工图形化工具,可以同时监控多个web应用该项目是借鉴另个一开源项目JavaMonito初始版演变而来,剔除了一些功能,增加了可远程监控模块,只需要在需要监控的项目集成...

    在Eclipse状态栏上增加JVM内存用量指示器

    因此,实时监控JVM内存用量可以帮助开发者及时发现并解决潜在的性能问题。 要实现这个功能,通常需要以下步骤: 1. **安装插件**:Eclipse有一个名为Memory Analyzer Tool (MAT)的内置工具,用于分析内存泄漏。...

    IBM Thread and Monitor Dump Analyzer (TMDA)

    IBM Thread and Monitor Dump Analyzer (TMDA) 是一个专门用于分析Java应用程序的线程和监控器转储的工具。在Java应用开发和运维过程中,线程 dump 是诊断和解决性能问题、死锁、线程阻塞等关键问题的重要手段。TMDA...

Global site tag (gtag.js) - Google Analytics