jvm性能调优监控工具,jvm故障诊断与性能优化
用于监控和故障排除工具的命令行工具:jps、jinfo、jstack、jmap、jstat、jstatd、jcmd。
图形化工具:JConsole,jmc,VisualVM。
两种连接模式:JMX和jstatd。
JVM监控工具的功能1。运行时监控JVM内部情况,如检查JVM参数、CPU、内存、堆等信息。
2.协助性能调优。
3.协助解决应用运行时的一些问题,如OutOfMemoryError、内存泄漏、线程死锁、锁争用、Java进程CPU消耗高等。Jps:虚拟机进程状态工具jps(JVM进程状态工具)可以列出正在运行的虚拟机进程,并显示虚拟机的主类(Main()函数所在的类)名称和这些进程的本地虚拟机标识符(LV MID),即进程ID。
Jps命令格式
Jps [options] [hostid]]参数:-q:只输出LVMID(进程id),省略主类名。-m:数据虚拟机进程启动时传递给主类main()函数的参数。-l:输出主类的全名,如果进程正在执行Jar包,则输出Jar路径。-v:数据虚拟机进程启动时的JVM参数。将不解释该命令的各种参数的含义,但将介绍其常见用法。如果想了解更多,可以去上面地址的官方文档。
Jps可以通过RMI(远程方法调用)协议查询启用了RMI(远程方法调用)服务的远程虚拟机的进程状态。hostid是在RMI注册表中注册的主机名。
如果不指定hostid,默认情况下它将是当前主机或服务器。
J info: Java配置信息工具jinfo(Configuration Info for Java)用于实时查看和调整虚拟机参数。可以使用jps命令的-v参数查看虚拟机启动时显式指定的参数列表,但如果想知道未显式指定的参数的系统默认值,只能使用jinfo的-flag选项进行查询(如果仅限于1.6版以上,使用java-XX: PrintFlagsFinal查看参数默认值也是不错的选择)
金佛命令格式
Jinfo [option] pid参数:-v:查看虚拟机启动时明确指定的参数列表。-flag name:打印指定java虚拟机的参数值。-flag name=value:修改一些可以在运行时修改的虚拟机参数值。-flag [-]name:设置或取消分配java虚拟机参数的布尔值。Jstack:Java堆栈跟踪工具jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件),即查看一个Java进程中的线程堆栈信息。
线程快照是每个线程在当前虚拟机中执行的方法堆栈的集合。生成线程快照的主要目的是定位线程长期停滞的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。这些都是线程长期停滞的常见原因。当一个线程停止时,通过jstack查看每个线程的调用栈,就可以知道没有响应的线程在后台做什么或者在等待什么资源。
Jstack命令格式
Jstack [options] pid参数:-F:当正常输出请求未被应答时,线程栈被强制输出。-l:显示除堆栈之外的锁的其他信息。-m:显示本地方法的堆栈(C/C)。Jmap:Java内存映射工具jmap(Memory Map for Java)命令用于生成heapdump快照(通常称为堆转储或转储文件)。如果不使用jmap命令,还有一些更“暴力”的手段可以获得Java堆转储的快照:比如-xx: heapdumpoutofmemoryerror参数可以使OOM中的虚拟机异常。
之后,将自动生成转储文件。可以使用[Ctrl] [Break]键通过-xx: HeapdumponCTRLBreak参数让虚拟机生成转储文件,或者发送进程退出信号“吓唬”Linux系统下的虚拟机获取转储文件。
Jmap命令格式
Jmap [options] pid参数:-dump:生成Java堆转储快照。格式为:-dump: [live,] format=b,file=filename,其中live子参数指示是否只转储幸存的对象。-heap:显示java堆的详细信息,比如使用哪个回收器、参数配置、绑定状态等。仅在Linux/Solaris平台上有效。-histo:显示堆中对象的统计信息,包括类、实例数和总容量。-F:当虚拟机进程不响应-dump选项时,此选项可用于强制生成转储快照。仅在Linux/Solaris平台上有效。JSAT:虚拟机统计监控工具JSAT (JVM统计监控工具)是一个命令行工具,用于监控虚拟机的各种运行状态信息。可以显示类加载、内存、垃圾回收、JIT编译等运行数据。在本地或远程虚拟机进程中,它将是在仅提供纯文本控制台环境而没有GUI图形界面的服务器上定位运行时虚拟机性能问题的首选工具。
Jstat命令格式
jsat[general option output options vmid[interval[s ms][count]]参数:-class:监控类加载、卸载数量、总空间以及类加载锁消耗的时间。-gc:监控Java堆状态,包括Eden区域、两个survivor区域、老龄、永久生成容量、已用空间、总gc时间等信息。-gcutil:监控内容与-gc基本相同,但输出主要关注已用空间占总空间的百分比。-gcnew:监控新一代GC的状况。-gcold:监测老年期GC状态。-编译器:输出JIT编译器编译的方法、耗时等信息。-printcompilation:输出经过JIT编译的方法。Jstatd: jstatd,虚拟机的jstat守护进程,主要用于监控JVM的创建和终止,提供接口允许远程监控工具附着到本地主机上运行的JVM。
Jstatd工具是一个RMI服务器应用程序,主要用于监控HotSpot Java虚拟机的创建和终止,并提供一个接口,允许远程监控工具附加到运行在本地主机上的JVM上。
Jstatd服务器需要在本地主机上有一个RMI注册表。jstatd服务器将尝试在缺省端口或由-p port选项指定的端口连接到RMI注册表。如果RMI注册表不存在,jstatd应用程序将自动创建一个并绑定到-p port选项指定的端口,或者如果省略-p port选项,则绑定到默认的RMI注册表端口。您可以通过指定-nr选项来禁止创建内部RMI注册表。
注意:此工具不受支持,并且无法确定它是否将在JDK的未来版本中可用。目前,该工具不适用于Windows 98和Windows ME平台。
Jstatd命令格式
Jstatd [options]参数:-nr:当无法找到现有的RMI注册表时,不要尝试使用Jstatd进程创建内部RMI注册表。-p port:在指定的端口查找RMI注册表。如果没有找到它,并且没有指定-nr选项,将在这个端口上创建一个内部RMI注册表。-n terminame:RMI注册表中绑定的RMI远程对象的名称。的默认名称是JStatRemoteHost。如果多个jstatd服务器在同一个主机上运行,您可以指定这个选项,使每个服务器导出的RMI对象具有唯一的名称。在任何情况下,都有必要在监控客户端的hostid和vmid字符串中包含唯一的服务器名称。-jo option:将选项参数传递给javac调用的java启动器。例如,-J-Xms48m将启动内存设置为48 MB。使用-J将选项参数传递给执行Java应用程序的低级虚拟机是一种常见的做法。Jcmd: JDK7 update 4,jvm诊断命令行工具,增加了一个新的Jcmd诊断命令行工具,这是一个多功能的工具。它向正在运行的Java虚拟机发送诊断命令请求,可以导出栈、查看JVM进程、导出线程信息、执行GC等。
Jcmd不提供远程方法,但只能查看本地jvm信息:
JCMD PID 主类命令. Perfcounter.print -F文件参数含义:jcmd PID VM.uptime:检查JVM的启动时间。Jcmd PID GC.class_histogram:检查JVM的类信息,可以检查每个类的实例数和占用空间。Mdpidthread.print:检查JVM的线程转储。Mdpidgc.heap _ dumpfile _ name:检查JVM的堆转储,注意如果只指定了文件名,默认情况下会在JVM启动的目录下生成。Mdpidvm.system _ properties:查看JVM的属性信息。Jcmd PID VM.flags:检查JVM的启动参数。注意可以看到-X和-XX的参数信息。Jcmd PID VM.command_line:检查JVM的启动命令行。Jcmd PID GC.run_finalization:在JVM上执行Java . lang . system . run finalization(),尽量不要调用这个对象的finalize方法。Jcmd PID GC.run:在JVM上执行java.lang.System.gc()告知垃圾收集器打算收集垃圾,但不确定垃圾收集器是否会收集垃圾。Jcmd PID PerfCounter.print:检查JVM的性能。JConsole: JConsole (Java监控和管理控制台),一个基于JMX的可视化监控和管理工具,随JDK提供。
系统有一定负载时可以使用;详细跟踪垃圾收集算法。
JConsole[-interval=n] [-notile][-插件路径路径][-版本][连接.]-interval:将更新间隔设置为N秒(默认值为4秒)-notile:最初不平铺窗口(针对两个或更多连接)-pluginpath:指定jconsole用来查找插件的路径-version:输出程序版本Connection=PID host:port JMX URL(服务:JMX:协议://.)Pid目标进程的进程id主机远程主机名或IP地址端口远程连接端口号-J指定运行jconsole的Java虚拟机的输入参数。执行命令后,打开新的连接窗口。有两种
1)本地流程2)远程流程
1.概述显示有关Java VM和监视值的概述信息,包括CPU使用率、内存使用率、线程数和Java VM中加载的类的图形监视信息。
2.Memory显示关于内存消耗和内存池的信息。
Memory选项卡有Execute GC按钮,可以随时单击该按钮来执行垃圾收集。
该图表显示了一段时间内Java VM的内存使用情况,堆和非堆的内存使用情况,以及特定内存池的内存使用情况。
Java VM管理两种内存:堆内存和非堆内存,这两种内存都是在Java VM启动时创建的。
1)堆内存是Java VM为所有类实例和数组分配内存的运行时数据区域。堆的大小可以是固定的或可变的。垃圾收集器是一个自动内存管理系统,可以回收对象的堆内存。a .伊甸园空间:
在伊甸园区,当对象被创建时,它们首先被放置在伊甸园空间中。在垃圾收集之后,不能被收集的对象被放置在空的幸存者区域B中。幸存者空间:
幸存者区,用于保存伊甸园空间内存区垃圾收集后未被收集的对象。
幸存者空间分为两个空间大小相同的区域,即To Survivor和From Survivor,伊甸园空间和幸存者空间始终保持一个幸存者为空,属于新生代。
新一代的垃圾回收称为未成年GC(或年轻GC),每未成年GC后留下的对象年龄(即用于判断对象是否进入老年的标志)加1。
* C.Old Gen:在旧时代,用于存储新生代经过多次垃圾回收后仍然存活的对象。也有可能新一代无法分配内存的大对象直接进入旧时代。经过多次垃圾回收没有被回收的对象,其年龄足够大,将被放入老年。当陈年满时,虚拟机进行垃圾回收,称为重大GC。主GC需要扫描和回收除并发GC以外的整个堆,所以堆内存,也称为全GC,默认情况下是物理内存的1/64 (1GB)。当默认的空闲堆内存小于40%时,JVM会将堆增加到最大限制-Xmx,可以通过MinHeapFreeRatio参数进行调整;当默认的空闲堆内存大于70%时,JVM会将堆减少到-Xms的最小值,这个值可以通过MaxHeapFreeRatio参数进行调整。
2)非堆内存包括所有线程共享的方法区和Java VM内部处理或优化所需的内存。它存储每种类型的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码。
该区域在逻辑上是堆的一部分,但是根据实现的不同,Java VM可能不会对其进行垃圾收集或压缩。
与堆内存一样,方法区域可以是固定大小或可变大小的。方法的内存不需要是连续的。
* A.Metaspace: Metaspace,是HotSpot jvm中方法区域的实现。方法区主要用于存储类信息、常量池、方法数据、方法代码等。方法在逻辑上是堆的一部分,但它通常被称为“非堆”,以区别于堆。* B .代码缓存:HotSpot Java VM还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。* C .压缩类空间:压缩类空间3。线程显示关于线程使用的信息。
红色:峰值线程数,蓝色:活动线程数。
左下角的线程列表列出了所有活动的线程。
单击线程列表中的线程名称以显示有关线程的信息,包括线程名称、状态和堆栈跟踪。
4.类监控加载显示关于类加载的信息。
红线是加载的类的总数(包括那些随后卸载的),蓝线是当前加载的类的数量。
“Details”部分显示自Java VM启动以来加载的类的总数、当前加载的类的数量和卸载的类的数量。
选中右上角的复选框,将类加载跟踪设置为详细输出。
5.虚拟机信息提供有关Java虚拟机的信息。
6.mbean显示在平台上注册的所有mbean的信息。
左侧的树结构显示了所有MBean。
选择MBean后,其属性、操作、通知和其他信息将显示在右侧。
可以查看两种远程连接方式JMX连接:系统信息、CPU使用情况、线程数量、手动垃圾收集等。这些是更多的系统级信息。
Jstatd连接模式可以提供:JVM内存分布细节,垃圾收集分布图,线程细节,甚至一个对象使用的内存大小。要连接tomcat来配置JMX支持,您需要在Tomcat的catalina.sh中添加一些设置:
修改Tomcat下的bin/catalina.sh文件,搜索执行请求的命令,添加下面的内容(ip改为自己的):catalina _ opts= $ catalina _ opts-DCOM . sun . management . JMX remote=true-DJ ava . RMI . server . hostname=10 . 1 . 1 . 52-DCOM . sun . management . JMX remot . e . port=1099-DCOM . sun . management . JMX remote=false-DCOM . sun . management . JMX remote。
需要开启认证功能(用户密码登录监控),并修改为以下内容:
卡特琳娜_ OPTS= $卡特琳娜_ OPTS-DCOM。星期日管理。JMX远程=真实-DJ阿瓦。RMI。服务器。主机名=10。1 .1 .52-DCOM。星期日管理。JMX遥控器。港口=1099-DCOM。星期日管理。JMX遥控器。SSL=false-DCOM。星期日管理。JMX遥控器。authenticate=true-DCOM。星期日管理。JMX遥控器。密码。文件=./conf/JMX遥控器。密码是DCOM。星期日管理。JMX遥控器。访问。文件=./conf/JMX遥控器。访问服务器。主机名:ipjmx remote。端口:开启管理扩展的端口jmxremote.ssl:是否开启ssl(假/真)jmxremote.authenticate:是否开启鉴权功能,账号密码远程监控(对/错)jmxremote.password.file:密码文件路径jmxremote.access.file:权限文件路径
创建文件触摸JMX遥控器。密码JMX遥控器。接近
在JAVA_HOME\jre\lib\management下有模板
jmxremote.password文件添加以下内容:
#(123456、123456789为密码)监控角色123456控制角色123456789 JMX远程。接近文件添加以下内容:
monitorRole readonlycontrolRole读写新建完成这两个文件要修改jmxremote.password的权限
#赋值权限chmod 600 jmxremote.password配置jstatd(jdk13):1,自定义一个统计政策文件,添加:授予代码库”jrt:/JDK。jstatd "权限Java。安全。所有权限;};授予代码库”jrt:/JDK。内部。jvmstat "权限Java。安全。所有权限;};然后在JDK _家/宾下面运行jstatd,示例如:/jstatd-J-djava。RMI。服务器。主机名=192。168 .1 .102-J-djava。安全。策略=Java。策略=Java。政策-p 1099参考:
https://blog.csdn.net/zzti_erlie/article/details/86517158
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。