前言

之前做的小功能jar管理应用,启动、停止,尤其停止需要用pid来停止应用,现在说下怎么获取。

当然,不需要记录pid也能停止应用,可以通过命令找到应用对应的pid,不过记录下来比较方便,后续还用到pid来获取端口号,利用java代理。

一、JMX是什么、可以做什么

什么是JMX

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。- form baidu

好像看了也很迷,它能做什么?

JMX默认的MBean它能获取应用的信息,尤其是运行时的信息,可以知道实时内存、线程使用情况。同是也可以自定义对象MBean注册上去,目标应用可以获取到该对象,使用很灵活,譬如可以做配置值,动态改变。

二、JMX获取pid

既然它能获取应用信息,运行时信息,那怎么获取呢

首先在应用启动的是,添加启动参数

#开启 JMX 远程控制
-Dcom.sun.management.jmxremote
#目标应用ip
-Djava.rmi.server.hostname=
#监听端口号,不能与目标应用端口一致
-Dcom.sun.management.jmxremote.port=
#是否开启鉴权
-Dcom.sun.management.jmxremote.authenticate=false
#是否开启 SSL
-Dcom.sun.management.jmxremote.ssl=false当开启权限(-Dcom.sun.management.jmxremote.authenticate=true)之后,需要添加账号密码
#密码文件 默认JAVA_HOME/conf/management/jmxremote.password
-Dcom.sun.management.jmxremote.password.file=
#权限文件 JAVA_HOME/conf/management/jmxremote.access
-Dcom.sun.management.jmxremote.access.file=

譬如:地址用127.0.0.1 port 12580

java -Dfile.encoding=utf-8 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=12580 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar D:\jarmanage\jarManage\jarStroage\8f34f6bbde5f40bbb375b5d35f8fcf0c\jar-manage\jar-manage.jar >> D:\jarmanage\jarManage\jarLog\8f34f6bbde5f40bbb375b5d35f8fcf0c\jar-manage\jar-manage.log

启动之后,我们可以找到jdk bin目录下面的jconsole.exe 启动会有一个连接界面,一个可视化监控

点击远程,输入上面jar启动给的127.0.0.1:12580,就可以看到应用运行情况了

咳咳,是不是很迷为啥要点击jconsole.exe连接远程看?跟我们在java后端获取pid有什么关系?

一个是知道有这个东西可以远程监视java应用运行情况,另外重点我们可以在上面看到有个Mbean的东西。

我们找到java.lang 可以看到OperatingSystem(可以获取操作系统相关的信息)、Memory(可以获取内存使用情况信息)、Runtime(可以获取运行时情况信息)、Threading(可以获取线程情况,巅峰线程、历史线程等)等对象,特别是Runtime对象的名称2188@xx的2188是不是很熟悉,这2188就是上面Jconsole连接时候本地进程-jar-manage对应的pid。

好了我们现在知道从哪里可以获取到pid!!

嗯,到在java后端,用上面的远程地址、端口怎么获取pid了

写一个main方法执行。。

 public static void main(String[] args) {String ip = "127.0.0.1";Integer port = 12580;JMXConnector connector = null;String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":" + port + "/jmxrmi";try {JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);Map<String, Object> map = new HashMap<String, Object>();//账号密码,之前没有开启权限,这里传个空数组就好,按实际填// String[] credentials = new String[] { "monitorRole", "QED" };String[] credentials = new String[] {};map.put("jmx.remote.credentials", credentials);connector = JMXConnectorFactory.connect(serviceURL, map);MBeanServerConnection mbsc = connector.getMBeanServerConnection();MemoryMXBean memoryMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.MEMORY_MXBEAN_NAME, MemoryMXBean.class);RuntimeMXBean runtimeMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.RUNTIME_MXBEAN_NAME, RuntimeMXBean.class);ThreadMXBean threadMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.newPlatformMXBeanProxy(mbsc, ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, OperatingSystemMXBean.class);String jvmName = runtimeMXBean.getName();System.out.println("pid:" + jvmName.split("@")[0]);} catch (Exception e) {e.getStackTrace();}

可以看到获取到pid了。

嗯~,获取pid过程就这样了。

关于MemoryMXBean、RuntimeMXBean、ThreadMXBean、OperatingSystemMXBean的相关信息可以去看下类里面是什么东西,另外我们可以用它做什么?譬如做一个实时监控系统?内存预警?那就是自由发挥了。

拓展

1、文章开头说了MBean是过注册到JMX上去,这怎么注册留给下一章,另外注册上去可以做什么也是值得思考的。

2、目标应用的port 就是利用ava代理和自定义MBean注册上去,然后本地应用就能获取目标应用的port了。

3、我的其中一个应用例子springboot jar、war包管理界面化_sakyoka的博客-CSDN博客,在jar 管理应用中获取pid就是重中之重。

日常记录:java JMX获取MBean从而获取目标应用的pid相关推荐

  1. 日常记录:java启动参数 -javaagent的使用,应用启动前添加代理包并且注册Mbean

    前言 有时候是不是很苦恼想在不修改别人的应用(或者统一处理所有的应用)情况下如何添加额外功能?那么-javaagent启动参数就能处理这个问题. 还有上一章讲的(日常记录:java 注册以及获取MBe ...

  2. Java程序员学习笔记——Mybatis日常记录

    目录 mybatis的基本概念 mybatis如何构建和执行的 mybatis的缓存 mybatis的插件系统 mybatis的日志系统 mybatis用到的设计模式 myabtis集成到spring ...

  3. java获取长度_获取java长度

    Java获取本机MAC地址 为什么写这个呢?因为前几天看见网上有采用windows命令获取局域网和广域网MAC,查了查可以直接用JDK的方法. MAC可用于局域网验证,提高安全性. import ja ...

  4. Java BufferImage图片处理(获取宽高、图片截取、转换灰度图)

    Java BufferImage图片处理(获取宽高.截取.转换灰度图) 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Java读取图片为byte[]数组,或者BufferedImage及互相转 ...

  5. 【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】...

    方法1:通过get()方法获取属性值 package com.sxd.test.controller;public class FirstCa{private Integer num;private ...

  6. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)

    摘要:本节主要来讲解Android10.0 JAVA层HIDL服务的获取原理 阅读本文大约需要花费19分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的 ...

  7. java系统时间怎么获取,java目前系统时间的获取

    java当前系统时间的获取 import   java.text.SimpleDateFormat; SimpleDateFormat   formatter   =   new   SimpleDa ...

  8. java 调用linux 脚本并获取返回值

    大家好,我是烤鸭: 今天分享下java 调用 shell脚本 并获取返回值. 代码实践 String cmd = "df -h"; StringBuffer sb = new St ...

  9. Java知识点总结(反射-获取类的信息)

    Java知识点总结(反射-获取类的信息) @(Java知识点总结)[Java, 反射] 应用反射的API,获取类的信息(类的名字.属性.方法.构造器等) import java.lang.reflec ...

最新文章

  1. 晶体三极管如何工作的?不,我是问它的真实工作原理
  2. 能直接复制图片中文字,功能远超普通OCR软件,MIT学生开发了一款强大Chrome插件...
  3. python中x=x+1的读法-python中a=a+1与a+=1的区别
  4. 转:C# 线程同步技术 Monitor 和Lock
  5. spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件
  6. redis rdb aof区别_Redis(三):持久化RDB,fork.copyonwrite,AOF,RDBamp;AOF混合使用
  7. 星期三—用JAVA制作简易的通讯软件
  8. 什么是redis缓存穿透, 缓存雪崩, 缓存击穿
  9. Ubuntu上安装jdk出现的错误
  10. springboot10 Web开发静态资源
  11. 肉肉好走,愿你在异界依旧快乐活泼
  12. JSOI2007 文本生成器
  13. 信息系统项目管理师 - 必考记忆口诀
  14. 证券公司主要信用业务(融资融券、股票质押、约定购回)
  15. 深度学习在图像分类中的发展
  16. 2022年认证杯SPSSPRO杯数学建模C题(第一阶段)污水流行病学原理在新冠疫情防控方面的作用求解全过程文档及程序
  17. 建行u盾单片机可以再次使用吗_Si7021建行U盾19264液晶制作温湿度显示,实物单片机代码开源...
  18. 传说之下三重审判用计算机怎么弹,传说之下三重审判无限血
  19. 浅析计算机网络技术相关论文,计算机网络技术浅析论文 - 经典论文
  20. 数电实验四-触发器(Multisim和Basys3)

热门文章

  1. ERP认证是什么 ?
  2. python输出宽度是什么意思_Python输出长度
  3. Jenkins Pipeline中的自定义环境变量
  4. 沧海一粟 之 杏花村
  5. 图片查看插件-magnify
  6. u盘正常接入后计算机无法看到,能识别U盘但显示不出来的解决办法【详解】
  7. 电脑浏览器打不开网页
  8. 前端常用时间工具 -- Moment.js常见用法总结
  9. 大数据之linux虚拟机的复制以及环境配置
  10. NBA总决赛。。。。