1.前言?我的开源分析工具小笔记。2.JDK原生工具2.1jinfoJDK提供了一个命令行工具,可以实时查看Java虚拟机的各种配置参数和系统属性。常见使用场景:查看JVM默认配置参数;检查修改的配置参数是否生效;其他的;usage:jinfo[parameter]parameterexample-flag打印指定名称对应的配置参数jinfo-flagPrintGC123(检查是否启用PrintGC)-flag[+,-]name启用或禁用参数withspecifiedname(指定参数必须是Boolean类型)jinfo-flag+PrintGC123(enablePrintGC)-flagname=valueJava虚拟机参数热修改,将指定名称的参数修改为指定值(java-XX:+PrintFlagsInitial命令显示标记为manageable的配置参数可以热修改)jinfo-flagMinHeapFreeRatio=30123(修改空闲堆空间最小百分比为30)-flagsprintall配置参数jinfo-flags123-sysprops打印当前Java虚拟机的所有系统属性,以键值对的形式jinfo-sysprops123个比较常用的flag名称(部分):CICompilerCount,ConcGCThreads,G1HeapRegionSize,G1ReservePercent,+HeapDumpOnOutOfMemoryError,InitialHeapSize、MarkStackSize、MaxGCPauseMillis、MaxHeapSize、MaxSpAspaceSize、MaxNewSize、MinHeapDeltAbytes,useCompresseClassClassPoInters,usecompressedoops,usecompresseops,usefastunorderedtimestamps,uselargepagesinuselargepagesIndividivivateIndividualAlivatientalaimantalalusparnewgcyuseparnewgc、常见使用场景:高响应时间RT,低TPS,低服务器资源消耗;您想查看程序正在做什么的其他场景;用法:jstack[参数]例如:jstack-m-l123>stack.日志参数-F的作用当正常输出请求没有响应时(进程挂起挂起),强制输出线程栈-m显示C/C++栈(如果有本地方法调用)-l显示锁的附加信息,非常方便遇到死锁时排查问题。可以配合免费的可视化分析工具使用,比如IBM的ThreadandMonitorDumpAnalyzerforJava(TMDA),下载地址:https://www.ibm.com/support/p..TMDA界面大致如下:2.3jmap提供堆转储和其他有关JVM内存使用情况的信息。常见使用场景:内存占用高或有持续增长趋势;频繁的FullGC;其他需要查看实物信息的场景;usage:jmap[parameter]parameterexample-dump:[live,]format=b,file=/you/path/filename.hprof输出jvm的堆对象内容到指定文件。live可选,表示是否只输出存活对象jmap-dump:format=b,live,file=heap.hprof123-finalizerinfo输出等待回收对象的信息。jmap-finalizerinfo123-heap输出当前java进程堆的概要信息,如GC算法,堆配置空间等jmap-heap123-histo[:live]输出实例数当前类、内存使用情况和类的全名。jmap-histo:live123>minidump.log-permstator-clstatsjdk8使用-clstats打印classload和jvmheap中permgeneration的信息,包括每个的名称、活动、地址和父代classloader类加载器和加载类的数量等信息。jmap-clstats1232.4jhat一般和jmap配合使用,用于jvm内存快照分析。内置HTTP/Web服务器,可以通过浏览器查看jmap生成的快照文件。用法:jhat[-stack][-refs][-port][-baseline][-debug][-version][-h|-help]例子:jhatheap.hprof参数function-stackfalse\true是否关闭跟踪对象分配调用堆栈。默认为true,即打开。-refsfalse\true是否关闭对象的引用跟踪。默认为true,即打开。-portport-number设置jhatHTTP服务器的端口。默认值为7000。-excludeexclude-file指定一个文件,列出应从可达对象查询中排除的数据成员。-baselineexclude-file指定基线堆转储。用于比较两个不同的堆快照。-debugint设置此工具的调试级别。级别0表示没有调试输出。要获得更详细的调试级别,您需要设置更高的值。一共3个级别,分别为0、1、2-version显示版本号-jflag将标志传递给运行jhat命令的Java虚拟机。例如:-J-mx512m,设置最大堆内存为512M-h查看帮助信息。2.5jstat用于查看JVM虚拟机中的类加载、内存、垃圾回收、即时编译等运行状态信息。Usage:jstatoutputOptions[-t][-h][[]]常见使用场景:内存使用异常,监控GC状态;频繁的FullGC;想了解其他类如Loading、即时编译等信息;参数作用示例-class显示类加载、卸载数量、总空间和加载时间的统计信息。jstat-class12315(查看123进程,1秒间隔,输出5次)-编译器显示即时编译方式,耗时等信息。略-gc显示堆的每个区域的内存使用情况和垃圾收集统计信息。略-gccapacity显示堆的每个区域的容量和对应空间的统计信息。(比-gc显示的信息更丰富)稍微-gcutil显示有关垃圾收集统计信息的摘要。(按使用百分比显示)-gccause显示有关垃圾收集统计信息的摘要(与-gcutil相同),以及最近和当前垃圾收集的原因。略-gcnew显示新生代的垃圾收集统计信息。略-gcnewcapacity显示新生代大小及其对应空间的统计信息。slightly-gcold显示老年代和元空间的垃圾收集统计信息。略-gcoldcapacity显示老年代大小统计。省略-gcmetacapacity显示元空间大小统计信息。省略-printcompilation显示即时编译方法的统计信息。输出字段含义省略,供参考:https://cloud.tencent.com/dev...2.6jcmd是JDK1.7之后新增的命令行工具。独特的功能是监控本机内存的使用情况。与jmap、jstat、jstack、jinfo等命令有功能重叠;使用参考:https://blog.csdn.net/weixin_...2.7jconsole可视化监控工具,可用于连接本地或远程运行的JVM,监控JVM资源消耗和性能。官方文档:https://docs.oracle.com/javas...2.8jvisualvmVisualVM可视化监控工具,可以连接和监控本地和远程JVM,可以监控线程,内存情况,查看内存中方法和对象的CPU时间,功能比jconsole更全面,还有丰富的第三方插件。官方文档:https://docs.oracle.com/javas...3.其他开源工具3.1MATeclipse开源的JVM堆内存快照分析工具;具体使用请参考:https://www.cnblogs.com/trust。..3.2Arthas基本包含了JDK自带工具的所有功能。除了没有漂亮的可视化界面,分析功能真的是天作之合。有很多炫酷的功能,比如:代码热修改、日志级别热修改拦截方式、参数传递和输出等。官方学习文档:http://arthas.gitee.io