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