JVM监控方法 - JvmMonitor

        在日常项目运作中,有时我们需要将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-monitor:一个简单的 JVM 指标监视器 一个简单的 JVM 统计监视器。 用法:在您的应用程序启动时实例化(例如在ContextLoaderListener ): JvmMonitorLoader loader = new JvmMonitorLoader(); loader.init(1, TimeUnit.SECONDS, new File("/tmp/"), 3000); 这将在端口 3000 上启动一个嵌入式 http 服务器,一个在 tmp 文件夹中存储数据的嵌入式数据库,以及读取 JVM 指标并将它们存储在数据库中的计划作业。 注意:不要忘记调用loader.close(); 当您的应用程序被销毁时。 去做: 建立一个漂亮的用户界面 显示所有图表 修复图表标签 收集更多指标 支持每集群数据(集群节点将通过多种方式检测:使用 AWS api;节点的硬编码列表;使用广播) 立即下载

相关推荐

JVM Monitor

JVM Monitor 是一个 Eclipse 上的插件,用来分析Java应用程序运行的信息,包括CPU占用、线程以及内存的使用情况。

<JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇

1. 概述篇 1.1. 大厂面试题 1.2. 背景说明 1.3. 调优概述 1.4. 性能优化的步骤 1.5. 性能评价/测试指标 2. JVM监控及诊断工具-命令行篇 2.1. 概述 2.2. jps:查看正在运行的Java进程 2.3. jstat:查看JVM统计信息 2.4. jinfo:实时查看和修改JVM配置参数 2.5. jmap:导出内存映像文件&内存使用情况 2.6. jhat:JDK自带堆分析工具 2.7. jstack:打印JVM中线程快照 2.8. jcmd:多功能命令行 2.9. j

VectorX's Blog 1861

DeepSeek 在 PostgreSQL 中,执行 `DELETE` 操作后,数据占用的空间并不会立即释放给操作系统

操作后,数据占用的空间并不会立即释放给操作系统。这是 PostgreSQL 的 MVCC(多版本并发控制)机制决定的——删除的数据只是被标记为“死元组”,物理空间仍然被表占用。这是最彻底的释放方式,会将表重写为一个没有空洞的新文件,将空间返回给操作系统。如果你的表非常大(如几百GB),或者这是生产环境的核心表,建议优先考虑。你可以告诉我你的表大概多大、是否能接受锁表,我可以给你更精确的建议。要真正释放空间,需要根据你的实际需求,从以下三种方案中选择一种。如果你既想彻底释放空间,又无法接受锁表,

m0_37843156的博客 404

JVM 命令行监控工具详解

JVM 命令行监控工具 ①.jinfo 【显示jvm虚拟机的配置信息】 我们先来查下文档jinfo的用法 使用命令man -jinfo查看用户手册 NAME jinfo - configuration info SYNOPSIS jinfo [ option ] pid jinfo [ option ] executable core ...

简乐君 1138

python调用hypermesh调用tcl_TclTk如何调用HyperMesh运行tcl脚本文件

#Tcl/Tk编写界面部分set t [toplevel .tp]focus $tgrab $tset Filename "E:/CAE_Tech/process_files/88/Example.tcl"set Font "Times 12 bold"wm title $t "Call HyperMesh"wm attribute $t -topmost 1wm withdraw $tset t...

weixin_39541681的博客 1600

计算机组成原理 微程序控制器实验

微程序控制器实验 实验环境 计算机组成原理实验环境 实验目的 掌握微程序控制器的组成原理和工作过程。 理解微指令和微程序的概念,理解微指令与指令的区别与联系。 掌握指令操作码与控制存储器中微程序的对应方法。熟悉根据指令操作码从控制存储器中读出微程序的过程。 实验要求 做好实验预习,读懂实验电路图,熟悉实验元器件的功能特性和使用方法。 按照实验内容与步骤的要求,独立思考,认真仔细地完成实验。 写出实验报告。 实验电路        

Long_UP的博客 7万+

如何监控和诊断JVM堆内和堆外内存使用?

文章目录 典型回答 了解 JVM 内存的方法有很多,具体能力范围也有区别,简单总结如下: 可以使用综合性的图形化工具,如 JConsole、VisualVM(注意,从 Oracle JDK 9 开始,VisualVM 已经不再包含在 JDK 安装包中)等。这些工具具体使用起来相对比较直观,直接连接到 Java 进程,然后就可以在图形化界面里掌握内存使用情况。 以 JConsole 为例,其内存页面可以显示常见的堆内存和各种堆外部分使用状态。 也可以使用命令行工具进行运行时查询,如 jstat 和 jm

qq_24095055的博客 1522

从零开始理解二极管限幅:5种典型电路设计及实际应用场景解析

本文系统解析了二极管限幅电路的五大经典拓扑,包括串联与并联型上下限幅及双向限幅。通过剖析其核心原理与二极管的单向导电性、正向压降特性,结合ADC输入保护、电源管理、音频处理等实际应用场景,提供了从器件选型到设计陷阱规避的完整实战指南,帮助工程师为信号构建可靠的“安全笼”。

2y3u4i5o6p的博客 1034

JVM监控和调优常用命令工具总结

阅读目录 JVM监控和调优 jps jinfo jstat jstack jmap jhat jconsole, jvisualvm 回到顶部 JVM监控和调优 在Java应用和服务出现莫名的卡顿、CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非常方便了。本文总结了最常用的命令行工具及其常用参数解释,图形化监控工具的用法,仅供参考。 回到顶部 jps Java版的ps命令,查看java

zxh2075的专栏 560

PSCAD通过python调用自动化库的实现

带有python脚本的pscad自动化PSCAD通过python调用自动化库的实现前期准备实现 PSCAD通过python调用自动化库的实现 在网上搜了一圈没有找到,通过油管的一个视频学到了,这里分享一下。 前期准备 下载PSCAD 在官方文档中建议PSCADV4.6.1及以上版本 下载python python这里没注明哪些版本可用,博主下载了最新的3.8.2使用正常。 下载IDE py...

橙子的博客 5914

微信数据库读取解密脚本 聊天记录查看工具,支持所有微信版本,后期将支持企业微信[Windows]

(1)获取微信昵称、微信账号、微信手机号、微信邮箱、微信KEY的基址偏移(2)获取微信的微信昵称、微信账号、微信手机号、微信邮箱、微信KEY、微信原始ID(wxid_******)(3)获取微信文件夹路径(4)支持查看聊天记录查看(5)根据key解密微信数据库(6)提供数据库部分字段说明(7)支持微信多开场景,获取多用户信息等(8)微信需要登录状态才能获取数据库密钥(9)支持导出聊天记录为html,备份微信聊天记录,方便查看(10)合并多个数据库,方便查看。

weixin_43101935的博客 1万+

JAVA并发-Monitor简介

什么是Monitor?1.Monitor是一种用来实现同步的工具2.与每个java对象相关联,即每个java对象都有一个Monitor与之对应3.Monitor是实现Sychronized(内置锁)的基础Monitor的基本结构是什么?1.Owner字段:初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL2.E...

ignorewho的博客 1万+

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。

几度春风里的博客 4058

JVM Monitor: 实时监控与性能优化的利器

JVM Monitor: 实时监控与性能优化的利器 是一个由TyCoding开源的Java应用程序,它提供了强大的JVM实时监控功能,帮助开发者更好地理解和优化他们的Java应用性能。借助此工具,你可以轻松地获取关于内存、线程、类加载和GC等关键指标的信息。 技术分析 JVM Monitor是基于Java Swing开发的图形界面应用,它通过JMX(Java Management Extensio...

gitblog_00047的博客 683

企业级 Token 中转架构设计:高并发、多模型、费用监控一次搞定

摘要:本文针对企业级AI开发中的多模型接口混乱、高并发稳定性差及Token费用失控等痛点,提出一套2026年企业级Token中转架构解决方案。该方案采用五层分层设计(接入层、网关层、调度层、服务层、存储层),实现多模型统一接口、智能路由、高并发限流容错及精细化成本监控。核心功能包括:异构模型标准化接入、动态路由策略(场景/成本/负载/容灾)、多级限流熔断机制、全链路Token计费与安全防封体系(指纹清洗、IP池隔离)。通过分层解耦与模块化设计,企业可降低50%成本、提升99%稳定性,并避免封号风险。文章还提

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 147

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JVM监控命令详解

JVM监控命令基本就是 jps、jstack、jmap、jhat、jstat 几个命令的使用就可以了 JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开发中,有时候我们会碰到下面这...

oschina_40914891的博客 1194

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JVM Monitor学习

介绍 JVM Monitor是一个与Eclipse集成的Java分析器,用于监视Java应用程序的CPU,线程和内存使用情况。官网:http://jvmmonitor.org/index.html JVM Monitor对于快速检查Java应用程序非常有用,无需事先准备任何启动配置。 JVM Monitor自动在本地主机上查找正在运行的JVM,您可以轻松地开始监视它们。它还支持通过提供主机名和...

赶路人儿 890

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

使用JVM Monitor 3.6.0监视Java应用程序(alpha)

宣布了JVM Monitor 3.6.0(alpha) 。 这是与Eclipse集成的Java事件探查器,用于监视Java应用程序的CPU,线程和内存使用情况,而无需事先准备任何启动配置。 它可以自动在本地主机上找到正在运行的JVM,并可以通过主机名和端口号监视远程主机上的Java应用程序。 它已获得Eclipse Public License v1.0的许可。 翻译自: https://jax...

150

trace java_How to trace a java-program

In the same vain when debugging programs that have gone awry on a Linux system you can use similar tools to debug running JVMs on your system.Tool #1 - jvmtopSimilar totop, you can usejvmtopto see ...

weixin_29864831的博客 145

Eclipse 测试工具

1. Eclipse Test and Performance Tools Platform(TPTP )  TPTP addresses the entire test and performance life cycle, from early testing to production application monitoring, including test editing and e

My Backup 1660

JVM monitor

http://hawt.io/ 挺有意思的。   rsync和inotify http://my.oschina.net/rainingcn/blog/38819   关注淘宝博客: http://rdc.taobao.com/team/jm/archives/1675

weixin_33890499的博客 120

Some Java exceptions, messages and errors.

http://www.antapex.org/messages_java.txt http://www.jvmmonitor.org/index.html

weixin_33841503的博客 87

科普文:Elasticsearch系列之【Elasticsearch核心配置与性能调优】

由于Elasticsearch需要同时处理大量的文件和网络连接,因此可能会遇到文件描述符耗尽的情况,这会导致新的连接无法建立或索引操作失败。这是因为Lucene使用的数据结构(如FSTs)在内存中的表现与JVM的垃圾回收机制有关,过大的堆内存设置可能导致长时间的垃圾回收停顿。因此,需要根据实际情况进行权衡和调整。通过对Linux系统的内存、文件描述符、网络、I/O、CPU和线程、JVM和GC、集群和分片、监控和日志记录以及安全性等方面的优化设置,可以显著提升Elasticsearch集群的性能和稳定性。

为无为,事无事,味无味。 1177

jstat pid not found

(1)【一个小问题】jstat PID not found产生的原因 javajstattomcatjps  声 明:我的文章都是在实际工作中遇到并解决问题后撰写的,可能你早就一清二楚了,也可能对你没有任何帮助,喜欢就请顶一下,不喜也请勿喷。就像足球一样, 不喜欢中国足球的就请不要关注,你可以去看乒乓球、羽毛球,甚至,冰壶!但不要去骂他们,毕竟还有很多人痴心地喜欢国足,我就是...

longxzq的专栏 1049

Eclipse 插件简要分类

开发类: 基础类: 1.阿里巴巴代码规范Eclipse插件: https://p3c.alibaba.com/plugin/eclipse/update 2.文档添加工具: 搜索Market安装:JAutodoc工具生成自动生成。 OracleExplorer- Eclipse的Oracle插件 jQueryWTP- Eclipse的jQuery插件 Jadclip...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 373
上一篇: XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
下一篇: 钉钉机器人
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值