Java应用检测内容- 当java运行一个应用,就会生成一个JVM的实例,而java应用则运行于此JVM实例中,当应用退出,JVM实例也会关闭。启动多个java应用,也会启动多个JVM实例,它们不会相互影响(当然,它们都会占用系统的资源)。
- 虚拟机主要有三大模块,一个类加载子系统(
Class Loader Subsystem
,负责加载类),一个执行引擎(Execution Engine
,负责执行类的方法指令和垃圾回收),一个运行时数据区(Runtime Data Areas
,负责存放程序运行时的数据)。 - 其中运行时数据区分为方法区(存储如类信息,方法信息,引用,常量池等),堆(存储类实例对象和数组),java栈(以栈方式存放以帧为单位保存线程的运行状态帧),本地方法栈(跟本地方法相关的数据区),程序计数器(每一个线程都有它自己的程序计数器,表示下一条将被执行指令的“地址”)。
- java应用启动流程就是通过类加载子系统加载相关的类,然后把相关数据如类信息,方法等存到方法区的栈中,实例化相关的类,同时把实例对象存储在堆中,程序运行位置则是每个线程使用计数器来指定。方法区和堆是线程共享的,程序计数器及Java栈是线程私有的。
- 运行时数据区是java应用运行时的监测区域,其中各个区域的内存情况,特别是堆的内存使用情况,是重点区域。堆还会分年轻代、年老代及
Metaspace
,垃圾回收器会进行分代回收。通过它的回收情况监测,可以检测到是否存在内存泄漏,而java栈则与线程有关,线程的运行状态又与CPU相关,因此java栈的监测可以知道CPU占用过大的问题,同时方法区和java栈的占用内存大小也是一个监测的指标。
如何监测
Class Loader Subsystem
,负责加载类),一个执行引擎(Execution Engine
,负责执行类的方法指令和垃圾回收),一个运行时数据区(Runtime Data Areas
,负责存放程序运行时的数据)。Metaspace
,垃圾回收器会进行分代回收。通过它的回收情况监测,可以检测到是否存在内存泄漏,而java栈则与线程有关,线程的运行状态又与CPU相关,因此java栈的监测可以知道CPU占用过大的问题,同时方法区和java栈的占用内存大小也是一个监测的指标。按监测工具的监测方式,主要分为以下四大类:
- 程序内置-日志及监控页面
- java自带命令行监测工具
- java自带可视化监测工具
- 第三方诊断工具
1 程序内置监测
程序内置监测就比较简单,在初学java时,最常用的就是使用System.out.println()
把自己想要输出的内容输出,在开发阶段也有人喜欢这样,一方面可以输出业务内容,监测功能的正常与否,另一方面可以输出系统属性System.getProperties()
及System.getProperty()
。当然,现在更多的使用日志框架进行输出,并把日志按级别输出到文件中,如log4j
及logback
。对于Spring Boot
应用,还可以使用actuator
来监测程序运行情况。tomcat
容器自身也带有监测页面。此类监测主要特点是程序内置,并且通过日志输出来监测,开发人员相对比较熟悉了,一般来说在开发和测试阶段比较常用,而生产环境下,日志一般是error
级别或者由于安全考虑,自带的一些监测页面有可能会关闭。因此,此类监测不再细说。
2 java自带命令行监测工具
在jdk的安装目录下的的bin目录,已经提供了多种命令行监测工具,以便于开发人员和运维人员监测java应用,同时方便开发及运维人员对问题进行诊断,因此,此类工具是java应用监测的重要手段。一般来说,常用的命令行工具包括jps
,jinfo
,jmap
,jstack
,jstat
,其中
jps
查看java进程IDjinfo
查看及调整虚拟机参数jmap
查看堆(heap)使用情况及生成堆快照jstack
查看线程运行状态及生成线程快照jstat
显示进程中的类装载、内存、垃圾收集等运行数据。
通过这些工具,基本上可以了解java应用的内存变化状态,线程运行状态等信息,进而为应用监测及问题诊断提供依据。
3 java自带可视化监测工具
除了命令行工具,在windows平台下,jdk还提供了可视化监测工具,以更直观,更方便的方式对java应用运行状况进行监测。这两款工具分别是jconsole
和jvisualvm
,在jdk下的bin目录下可以找到。它们均可监测本地及远程的java应用,包括堆使用情况,线程使用,cpu使用,类加载情况,gc情况,jvisualvm
还可以生成相应的堆和线程快照,同时还可以使用相应的插件,以便于进一步分析。
4 第三方诊断工具
除了java自带的工具,一些第三方的工具也是监测及分析诊断,性能调优的利器,包括MAT
,BTrace
及Arthas
。其中
MAT
是eclipse
的内存分析插件,通过MAT
可以对dump出来的堆快照进行分析,并且辅助分析内存泄露原因,快速的计算出在内存中对象的占用大小,垃圾收集器的回收工作情况,并可以通过报表直观的查看到可能造成这种结果的对象。BTrace
是是sun推出的一款Java 动态、安全追踪(监控)工具,可以在不停机的情况下监控系统运行情况,并且做到最少的侵入,占用最少的系统资源。特别适用在生产环境下对java应用进行监测,问题排查。Arthas
是阿里开源的在线Java诊断工具,同样可以在不停机情况监控系统,包括内存情况,线程情况,GC情况,运行时数据,也可以监测方法参数、返回值,异常返回等数据,堪称神器,在生产环境下使用非常方便。