美文网首页Java · 成长之路
通过java代码获取jvm信息和系统信息

通过java代码获取jvm信息和系统信息

作者: LOC_Thomas | 来源:发表于2016-12-05 11:25 被阅读0次

前言

随着微服务的概念逐渐流行,监控成了必不可少的模块,本篇文章主要介绍一下如何通过java代码获得一些核心的数据,方便从各个方面对应用进行监控

获取jvm数据

�jvm数据是监控应用很重要的一系列参数,一般本地开发的时候可以通过jconsole来连到对应的进程上面,查看相关指标数据,但是在线上环境就不适合通过jconsole来查看了, 所以我们现在使用通过java代码来获得数据,然后上报出去,然后在外部通过展示。

那么如何通过java代码来得到这些参数呢?

获得jvm的堆内存代码

MemoryUsage heapMemoryUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
System.out.println("jvm.heap.init is " + (heapMemoryUsage.getInit()));
System.out.println("jvm.heap.used is " + (heapMemoryUsage.getUsed()));
System.out.println("jvm.heap.committed is " + (heapMemoryUsage.getCommitted()));
System.out.println("jvm.heap.max is " + (heapMemoryUsage.getMax()));

获得jvm的非堆内存代码

MemoryUsage nonHeapMemoryUsage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
System.out.println("jvm.nonheap.init is " + (nonHeapMemoryUsage.getInit()));
System.out.println("jvm.nonheap.used is " + (nonHeapMemoryUsage.getUsed()));
System.out.println("jvm.nonheap.committed is " + (nonHeapMemoryUsage.getCommitted()));
System.out.println("jvm.nonheap.max is " + (nonHeapMemoryUsage.getMax()));

上面的方法只能得到jvm的堆和非堆的整体数据,一般都知道堆和非堆里面都几个不同的区,用来做不同功能,那么如何得到不同区的数据呢?不多说,上代码

for (MemoryPoolMXBean pool : ManagementFactory.getMemoryPoolMXBeans()) {  
final String kind = pool.getType() == MemoryType.HEAP ? "heap" : "nonheap";  
final MemoryUsage usage = pool.getUsage();  
System.out.println("kind is " + kind + ", pool name is " + pool.getName() + ", jvm." + pool.getName() + ".init is " + usage.getInit());  
System.out.println("kind is " + kind + ", pool name is " + pool.getName() + ", jvm." + pool.getName() + ".used is " + usage.getUsed());  
System.out.println("kind is " + kind + ", pool name is " + pool.getName() + ", jvm." + pool.getName()+ ".committed is " + usage.getCommitted());  
System.out.println("kind is " + kind + ", pool name is " + pool.getName() + ", jvm." + pool.getName() + ".max is " + usage.getMax()); 
}

这样就可以得到各种区的具体参数。

获取操作系统参数

上面获得了jvm的参数,但是还是需要监控机器的参数,如果想获得机器的参数,仅仅通过jdk自带的api要获得,难度比较大,所以推荐使用一些开源的jar包。

大家比较熟悉的获得操作系统的jar包是, sigar这个包, 但是我试用了一下, 觉得这个包太难用了。 不是指sigar的api难用,而是他获得系统参数需要一些so文件或者dll文件,如果没有的话,调用sigar的api时候会抛出异常,所以要用起来还要去检查这些文件是否存在, 比较麻烦。

这个时候无意中发现了oshi这个包, 它不需要sigar所需要so或者dll文件, 仅仅需要一个jna的包, 就可以了。所以我在pom.xml里面加上了

<dependency>    
  <groupId>com.github.dblock</groupId>    
  <artifactId>oshi-core</artifactId>    
  <version>3.2</version>
</dependency>
<dependency>    
  <groupId>com.github.dblock</groupId>    
  <artifactId>oshi-json</artifactId>    
  <version>3.2</version>
</dependency>
<dependency>    
  <groupId>net.java.dev.jna</groupId>    
  <artifactId>jna-platform</artifactId>    
  <version>4.2.1</version>
</dependency>

然后通过oshi的api

SystemInfo si = new SystemInfo();
XXX xxx = si.getXXX();

这样就可以轻松获得系统各种参数了。

相关文章

  • 通过java代码获取jvm信息和系统信息

    前言 随着微服务的概念逐渐流行,监控成了必不可少的模块,本篇文章主要介绍一下如何通过java代码获得一些核心的数据...

  • Java 获取数据库的库、表、字段信息 (仅供参考)

    1 通过druid配置相关信息 druid jar包 java 代码 1.1 获取数据库相关信息(通过getMet...

  • JDK常用命令

    查看jdk版本java -version 获取jvm的进程号jps -lm 获取jvm的运行信息jinfo 100...

  • android系统信息

    1:通过Build类和System类来获取系统的信息,具体代码如下所示: 2:PackageManager 常用的...

  • 获取浏览器和系统信息

    B/S架构获取用户浏览器信息和系统信息 添加依赖 编写代码

  • Java Attach机制

    Java Attach机制 在JVM运行时,我们经常需要获取目标JVM运行时的相关信息。最典型的一个场景就是通过j...

  • js获取git分支信息

    1、git bash 获取分支信息 上面的代码是通过git命令获取的分支信息,怎么可以在项目代码里面获取分支信息呢...

  • '深入理解Java虚拟机'2018-04-18

    Java代码编译时期是将Java文件编译为Class文件。Java代码执行时期: 装载 JVM通过类的全限定名获取...

  • java 反射-类

    使用java反射机制可以在运行时期(runtime)检查java类的信息,通过获取类的信息你可以获取以下信息:1....

  • JS获取手机型号和系统版本

    前端浏览器获取设备信息和系统信息只能通过navigator对象的userAgent属性获取。小米9和苹果7plus...

网友评论

    本文标题:通过java代码获取jvm信息和系统信息

    本文链接:https://www.haomeiwen.com/subject/boukmttx.html