运用JMX远程监控、管理JVM

问题背景讨论:在JAVA运行时,对JVM系统的检测、管理是开发同学一直期望的,目前有一些开源产品开源针对JVM进行监控,例如javamelody等等,这样框架虽然好,但是如果使用会带来一些问题。第一:由于javamelody入口是一个filter,所以会带来性能问题、第二:如果应用服务器很多,会缺乏统一管理,此外安全性、爬虫等等问题略过不提
     JDK自带了故障检测工具Jconsole和1.6出来的Jvisualvm都可以远程对服务器进行监控,后者甚是提供可以在线得到ThreadDump和HeapDump文件,更是提供了可扩展插件功能(虽然可能会影响jvm服务器性能)
    但现状很多公司都有自己的运维团队,未必会把线上服务器的权限交给我们开发同学,所以有必要了解JAVA远程管理方面的知识,假设如果在后台有一套系统,可以管理、监控我们线上所有java服务器,如果出现问题不需要对每个服务器进行排查而是直接从列表中获取、定位到信息,岂不是一件很幸福的事情~

    书归正文,分享下近几天在JMX方面的知识,JDK的API中翻译过来对javax.management的描述

     提供 Java Management Extensions 的核心类。
     Java Management Extensions (JMXTM) API 是一个用于管理和监视的标准 API。典型用途包括:
       1) 查询并更改应用程序配置
       2) 累积有关应用程序行为的统计数据并使其可用
       3) 通知状态更改及错误状况。
       4) JMX API 还可以作为解决方案的一部分来管理系统、网络等。
       5) API 包括远程访问,远程管理程序可以基于这些目的与正在运行的应用程序进行交互。
     JMX核心类为Mbean。MBean 是表示资源的指定管理对象。它有一个管理接口,该接口包括以下内容:
       1) 可以读取和/或写入的指定名称和类型的属性 
       2) 可以调用的指定名称和类型的操作
       3) 可以由 MBean 发送的指定类型的通知。
     推荐一篇文章可以让大家入门
     http://www.ibm.com/developerworks/cn/java/j-lo-jse63/
   
     配置远程连接tomcat需要在tomcat所在服务器修改几个配置
      1) 修改JMX配置
      进入JAVA_HOME/jre/lib/management路径下面
      将jmxremote.password.template改成jmxremote.password,将内容中的monitorRole  QED的注释去掉
      将management.properties中的com.sun.management.jmxremote.port=(改成你想要的JMX端口号)
将  com.sun.management.jmxremote.ssl=false、                                                      com.sun.management.jmxremote.authenticate=false注释打开
     注意:linux下需要该权限,chmod 600 jmxremote.access, chmod 600 jmxremote.password
    window下特麻烦,现需要jdk装在NTFS文件系统下,选中文件,点右键“属性”-〉安全,点“高级”,去掉“从父项继承....”,弹出窗口中选“删除”,这样删除了所有访问权限。再选“添加”-〉高级,“立即查找”,选中你的用户,例administrator,点“确定",“确定"。来到权限窗口,勾选"完全控制",点"确定",OK了。
     用jconsole连接远程linux服务时, IP地址和port都输入正确的情况下,仍然是连接失败
vi /etc/hosts,将hostname对应的ip改为真实ip
     2) 修改tomcat启动参数
     windows下面为catalina.bat、linux下面为cataina.sh
    set CATALINA_OPTS=-Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port="JMXport"
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false

     如果不修改的时候默远程连接不上,远程连接的通过IP和JMX端口找到JVM虚拟机后无法定位具体哪个应用使用JMX端口,所以只有在启动tomcat情况后占用JMX

   关于配置JMX,可以具体参考http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html#remote
   
   实战远程连接TOMCAT
   1) 获取连接 
  

private static void getConnection() throws Exception {   
  
    //用户名、密码   
                 Map<String, String[]> map = new HashMap<String, String[]>();   
    map   
            .put("jmx.remote.credentials", new String[] { "monitorRole",   
                    "QED" });   
    String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.0.100:1000/jmxrmi";   
       
    JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);   
    connector = JMXConnectorFactory.connect(serviceURL, map);   
    mbsc = connector.getMBeanServerConnection();   
  
}   

  2) 获取所有的objectName

   Set MBeanset = mbsc.queryMBeans(null, null);   
Iterator MBeansetIterator = MBeanset.iterator();   
while (MBeansetIterator.hasNext()) {   
    ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator   
            .next();   
    ObjectName objectName = objectInstance.getObjectName();   
    MBeanInfo objectInfo = mbsc.getMBeanInfo(objectName);   
    System.out.print("ObjectName:" + objectName.getCanonicalName()   
            + ".");   
    System.out.print("mehtodName:");   
    for (int i = 0; i < objectInfo.getAttributes().length; i++) {   
        System.out.print(objectInfo.getAttributes()[i].getName() + ",");   
    }   
    System.out.println();   
}   

 

3) 获取堆内存信息

 ObjectName heapObjName = new ObjectName("java.lang:type=Memory");   
  
//堆内存   
MemoryUsage heapMemoryUsage = MemoryUsage   
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,   
        "HeapMemoryUsage"));   
long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配   
long usedMemory = heapMemoryUsage.getUsed();   
System.out.print("堆内存总量:"+heapMemoryUsage.getMax()/1024+"KB,当前分配量:"+commitMemory/1024+"KB,当前使用率:"+usedMemory/1024+"KB,");   
System.out.println("堆内存使用率:" + (int) usedMemory * 100  
        / commitMemory + "%");// 堆使用率   
  
      //栈内存   
        MemoryUsage nonheapMemoryUsage = MemoryUsage   
        .from((CompositeDataSupport) mbsc.getAttribute(heapObjName,   
                "NonHeapMemoryUsage"));   
        long noncommitMemory = nonheapMemoryUsage.getCommitted();   
long nonusedMemory = heapMemoryUsage.getUsed();   
  
System.out.println("栈内存使用率:" + (int) nonusedMemory * 100  
        / noncommitMemory + "%");   
           
//PermGen内存   
        ObjectName permObjName = new ObjectName(   
"java.lang:type=MemoryPool,name=Perm Gen");   
  
MemoryUsage permGenUsage = MemoryUsage   
        .from((CompositeDataSupport) mbsc.getAttribute(permObjName,   
                "Usage"));   
long committed = permGenUsage.getCommitted();// 持久堆大小   
long used = heapMemoryUsage.getUsed();//     
System.out.println("perm gen:" + (int) used * 100 / committed   
        + "%");// 持久堆使用率 

 

4) 获取堆中伊甸区

ObjectName youngHeapObjName = new ObjectName("java.lang:type=MemoryPool,name=Eden Space");   
    // 获取Mbean对象   
    MBeanInfo youngHeapInfo = mbsc.getMBeanInfo(youngHeapObjName);   
    // 获取对象的属性   
    MBeanAttributeInfo[] youngHeapAttributes = youngHeapInfo.getAttributes();   
           
    MemoryUsage youngHeapUsage = MemoryUsage   
                .from((CompositeDataSupport) mbsc.getAttribute(youngHeapObjName, "Usage"));   
           
       System.out.print("目前新生区分 配最大内存:"+youngHeapUsage.getMax()/1024+"KB,");   
       System.out.print("新生区已分配:"+youngHeapUsage.getCommitted()/1024+"KB,");   
       System.out.print("新生区初始化:"+youngHeapUsage.getInit()/1024+"KB,");   
       System.out.println("新生区已使用"+youngHeapUsage.getUsed()/1024+"KB");   
     

 

5) 获取线程

ObjectName managerObjName = new ObjectName(   
                "Catalina:type=Manager,*");   
        Set<ObjectName> s = mbsc.queryNames(managerObjName, null);   
        for (ObjectName obj : s) {   
               
            ObjectName objname = new ObjectName(obj.getCanonicalName());   
            System.out.print("objectName:"+objname);   
            System.out.print(",最大会话数:"  
                    + mbsc.getAttribute(objname, "maxActiveSessions")+",");   
            System.out.print("会话数:"  
                    + mbsc.getAttribute(objname, "activeSessions")+",");   
            System.out.println("活动会话数:"  
                    + mbsc.getAttribute(objname, "sessionCounter"));  

 

由于可以获取的信息很多,暂不全部列出来 
翻过头来看下tomcat对JMX的支持


     看完上面最后一段话,有没有一种很雷人的感觉

     关于tomcat对JMX的支持可以看下详细的文档
     http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html
    
     当我们默认直接访问tomcat提供的JMX接口时(http://localhost:8080/manager/jmxproxy/?qry=)会出现所有的MBeans,

 

 如果想要具体的MBeans只需要将其name后面的值放在url的后面  


  因此,在默认情况下我们看到的信息都可以通过远程方式获取到,下一篇会介绍如何远程管理Tomcat

性能测试中的jvm监控 楔子:做了一个接口测试,发现每次运行到4分中左右时tps会下降5倍左右,响应时间升高3呗。增加jvm中的xms和xmx的大小原先分配的内存xmx为1024提示至2048(服务器的总内存为8g设定xmx为总内存四分之一),重新测试,发现10分钟左右又会出现上诉情况。决定监楔子:做了一个接口测试,发现每次运行到4分中左右时tps会下降5倍左右,响应时间升高3呗。增加jvm中的xms和xmx的大小原先分配的内存xmx为1024提示至2048(服务器的总内存为8g设定xmx为总内存四分之一),重新测试,发现10分钟左右又会出现上诉情况。决定监控下jvm的内存使用情况,使用java自带的jconsole 立即下载

相关推荐

AI工程化之生成式UI & A2UI(一)

本文系统介绍了生成式UI和Google A2UI技术。生成式UI通过AI直接生成前端代码(完全生成式)或DSL(混合式),实现千人千面的动态界面和研发提效。Google A2UI提出组件级和消息级协议,采用JSON规范实现渲染框架解耦,支持多端渲染。文章详细阐述了A2UI的架构设计,包括协议生成、服务端处理和渲染器实现,并对比了与传统前端框架的差异,指出A2UI本质是UI=F(AI(UI)+AI(state))的创新模式。最后通过playground项目展示了A2UI的实践应用。

qq_34306228的博客 589

JMX实践-JMX连接端口

首先要从JMX URL说起。如下是一个典型的JMX URL: service:jmx:rmi://localhost:5000/jndi/rmi://localhost:6000/jmxrmi 这个JMX URL可以分为如下几个部分: service:jmx: 这个是JMX URL的标准前缀,所有的JMX URL都必须以该字符串开头。rmi: 这个是connector ser

caomiao2006的专栏 2万+

KALI虚拟机挂代理教程

需要你本地挂了代理,然后通过虚拟机连接本机代理端口,不说废话了,直接说怎么做了。 1.查看选项设置中自己的小飞机的本地端口是多少:(默认是1080) 2.本机win+r打开cmd,输入ipconfig查看本地ip,我的本地ip是192.168.0.107: 2.打开kali虚拟机,编辑ProxyChains配置文件: vi /etc/proxychains.conf 3.在文件末尾的ProxyList中添加物理机本地ip和1080端口作为代理地址: 4.保存并退出即可: esc :wq 回车 5.

qq_34853514的博客 3万+

JVM性能调优之JVM性能监控

JVM的性能监控主要关注以下几个方面: 垃圾回收、 JIT和类的加载。 垃圾回收器的监控: 几点需要关注的内容: 1. 使用的垃圾回收期的种类 2. java堆的大小 3. 新生代和老年代的大小 4.永久代的大小 5. minor GC的持续时间 6. minor GC的发生频率 7. minor GC回收了多少空间 8. major GC的持续时间 9. major GC的

Hsuxu的专栏 2876

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3500

使用 Wireshark 进行计算机网络协议分析

文章目录实验前准备一、Wireshark抓包示例二、Wireshark实作1、数据链路层实作一 熟悉Ethernet帧结构实作二 了解子网内/外通信时的 MAC 地址实作三 掌握 ARP 解析过程2、网络层实作一 熟悉 IP 包结构实作二 IP 包的分段与重组实作三 考察 TTL 事件3、传输层实作一 熟悉 TCP 和 UDP 段结构实作二 分析 TCP 建立和释放连接4、应用层实作一 了解 DNS 解析实作二 了解 HTTP 的请求和应答 实验前准备 本部分实验用到的是抓包和协议分析软件——Wiresha

weixin_51087836的博客 8199

<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

【Python】秋招机考 —— 2025/9/17 华为 AI 方向

秋招机考,华为 AI,使用 Python 完成编程。

一杯水果茶!足矣~ 1165

Java系列笔记(4) - JVM监控与调优

目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例 光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之。通过学习,我觉得JVM监控与调优主要的着眼点在于如何配置、如何监控、如何优化3点上。下面就将针对这3点进行学习。 (如果您对Java的内存区域划分和内存回收机制尚不明确,那在阅读本文前,请先阅读我的前一篇博客《J...

weixin_33947521的博客 800

结构光之相移法+多频外差的数学原理推导

‍论文:基于数字光栅投影的结构光三维测量技术与系统研究 [博]作者:李中伟 华中科技大学 2007功能:相移法:多频外差(三频N步相移法)01 相移法图1 待写入投影仪的理想N步相移条纹通常对于 步相移来说,生成第 幅条纹图像(如图1所示)的公式如下:402 Payment Required其中::背景光强:调制强度:像素点横向坐标:相移值图2 相机拍摄到的实际 N ......

3D视觉工坊 1189

【JTAG】1149.6协议详解

JTAG1149.6协议是1149.1协议中Boundary-Scan结构的扩展,1149.1对交流耦合、差分或两者兼有的情况并没有得到充分的处理。该协议支持新的I/O测试结构。需要时变(AC)信号的高级I/O引脚允许测试它们之间的连接,这包括所有差分信号引脚或单端信号引脚,通过设计支持交流耦合。..................

xuhe0206的博客 4574

JVM的监控与优化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33836223的博客 184

探索如何利用CST和ADS进行DDR的SIPI联合仿真

本文系统介绍了CST和ADS两款工具进行DDR信号完整性/电源完整性(SI/PI)联合仿真的方法。CST采用工作室协同方式,通过PCB布局导入、材料设置、模型分配等步骤,重点分析了电源阻抗优化和信号波形质量。ADS则利用SIPro、PIPro等专用工具,突出系统级验证和自动化优化功能。两者各有优势:CST擅长3D结构精确建模,ADS更适于快速系统验证。文章建议可根据项目需求混合使用两种工具,并提供了模型简化、频带选择等实用技巧。通过对比分析,为工程师选择仿真工具提供了决策参考。

一只豌豆象的博客 1150

施用JMX远程监控、管理JVM

运用JMX远程监控、管理JVM 问题背景讨论:在JAVA运行时,对JVM系统的检测、管理是开发同学一直期望的,目前有一些开源产品开源针对JVM进行监控,例如javamelody等等,这样框架虽然好,但是如果使用会带来一些问题。第一:由于javamelody入口是一个filter,所以会带来性能问题、第二:如果应用服务器很多,会缺乏统一管理,此外安全性、爬虫等等问题略过不提       JD

caomiao2006的专栏 3333

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

用JMX监测JVM的运行参数

翻译自http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html 用JMX管理你的JVMJMX是Java管理扩展的缩写,也是当前Java技术中很核心的一块,JMX使得构建可扩展、可管理、伸缩性好的Java框架变得更加容易。更重要的是,JMX是J2SE的一部分,也就是说,使用JMX还能获得很好的兼容性,因为它是

王程斯的专栏 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

通过jmx监控jvm信息

jmx概念 JMX(Java Management Extensions,即Java管理扩展)是Java平台上为应用程序、设备、系统等植入管理功能的框架。 通过JMX,我们可以监控Java应用程序运行状态,如内存、线程等信息。常用的运维监控如jconsole,jvisualvm,Zabbix、prometheus(通过jmx_exporter采集)等工具对JVM本身的监控都是通过JMX获取的信息。 MBean 托管Bean(Managed Bean,MBean)是一种通过依赖注入创建的JavaBean。托管

grant167的专栏 1768

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM 远程监控:JConsole 和 JVisualVM 的使用

JVM 远程监控:JConsole 和 JVisualVM 的使用官方文档准备工作开启远程监控和管理功能JConsole 远程监控启动 JConsoleJVisualVM 远程监控 官方文档 Jconsole 的相关文档,可以点击这里查看。 JVisualVM 的相关文档, 可以点击这里查看。 准备工作 开启远程监控和管理功能 不论是 JConsole 还是 JVisualVM ,都需要远程...

Andy's Blog 1659

JVM内存监控:VisualVM远程监控JVM

简介 VisualVM是一个集成多个JDK命令行工具的可视化工具。可以作为Java应用程序性能分析和运行监控的工具。开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。系统管理员可以利用它来监测、控制Java应用程序横跨整个网络的情况。Java应用程序使用人员可以利用它来创建包含所有必要信息的Bug 报告。VisualVM远程监控JVM有两种方式,JMX连接和jstatd连接。配置过程中

liufeng93的专栏 2541

使用 JMX 监控和管理 Java 程序

主题JMX 此篇文章介绍 Java JMX 技术的相关概念和具体的使用方式。 当前文章属于Java 性能分析优化系列文章,点击话题可以查看所有文章。 1. JMX 是什么? Java Management Extensions(JMX)技术是 Java SE 平台的标准功能,提供了一种简单的、标准的监控和管理资源的方式,对于如何定义一个资源给出了明确的结构和设计模式,主要用于监控和管理 Java 应用程序运行状态、设备和资源信息、Java 虚拟机运行情况等信息。JMX是可以动态的,所以也...

slw213106的博客 3195

JMX = JVM 的“管理总线”:从 MBean 到云原生监控

表面上看,JMX 像是一个 “老掉牙的远程监控接口”,但只要你往下追一层,会发现:几乎所有 JVM 生态里的“高级组件”,都把自己的内部状态挂在了 JMX 上。

qq_40286307的博客 868

Java应用通过jmx_exporter对外暴露jvm指标

jmx_prometheus_javaagent

forrest420的专栏 1801

jconsole远程监控认证,java远程监控,jmx监控应用,jmx ssl配置,jconsole ssl连接远程应用

知识普及 jmx JMX(java Management Extensions)是一个Java平台的管理和监控接口。任何程序,只要按JMX规范访问这个接口,就可以获取所有管理与监控信息,jconsole与Java VisualVM等常见监测工具都是基于jmx,JMX不但可以用于管理JVM,还可以管理应用程序自身。 JMX把所有被管理的资源都称为MBean(Managed Bean),MBean全部由MBeanServer管理,如果要访问MBean,可以通过MBeanServer对外提供的访问接口,例如RMI

qq_41633199的博客 2831

通过visualVM远程监控java进程

visualVM简介及配置,远程监控java进程

pursuitK的博客 2558

java jmx 监控_利用VisualVm和JMX远程监控Java进程

在前一篇文章里我们发现通过jstatd + VisualVm的方式,不能获得Java进程的CPU、线程、MBean信息,这时JMX就要登场了。自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建的MBean)注册到它里面,然后暴露给JMX client...

weixin_32571169的博客 558

使用rmi jmx JCONSOLE远程监控JVM

https://www.cnblogs.com/Dhouse/p/7827175.html 1) -Dcom.sun.management.jmxremote.port=8288 报错 Error: Password file not found: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/managem...

weixin_30725315的博客 274
上一篇: 整理关于JVM方面的知识点
下一篇: 解决 ”To prevent a memory leak, the JDBC Driver has been forcibly unregistered“
Program_newbie
博客等级 码龄18年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值