在日常的Java开发中,常见以下问题:
内存泄露某个进程突然cpu飙升线程死锁响应变慢如果遇到了以上这种问题,如何JAVA内存管理、垃圾回收、内存调优,来解决运行日志、异常堆栈、GC日志、线程快照、堆快照等问题?
jvm参数-Xms-Xmx-Xmn-Xss调优01java自带分析工具
通过java自带分析工具,如jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令,分析和监控工具可以加快我们的分析数据、定位解决问题的速度。
jstack:java堆栈跟踪工具
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
命令格式:
jstack[option]pidjstack[option]executablecorejstack[option][server-id
]remote-hostname-or-IP参数:-F:当’jstack[-l]pid’没有相应的pid时,强制打印栈信息。-l:长列表.打印关于锁的附加信息,例如属于java.util.concurrent的ownablesynchronizers列表。-m:打印java和nativec/c++框架的所有栈信息。-h
-help:打印帮助信息pid需要被打印配置信息的java进程id,可以用jps查询。1、过滤指定线程,打印堆栈信息
指令:jstackpid
grepthreadPid-C5--colorjstack
grep0x3be4-C5--color//打印进程堆栈并通过线程id,过滤得到线程堆栈信息。
过滤指定线程,打印堆栈信息2、查看java进程的线程快照信息
指令:jstack-lpid
查看java进程的线程快照信息从输出信息可以看到,有一个线程死锁发生,并且指出了那行代码出现的。如此可以快速排查问题。
jmap--java内存映射工具
jmap命令用于生产堆转存快照。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。
jmap[option]pidjmap[option]executablecorejmap[option][server-id
]remote-hostname-or-IP参数选项:-dump:[live,]format=b,file=filename使用hprof二进制形式,输出jvm的heap内容到文件。live子选项是可选的,假如指定live选项,那么只输出活的对象到文件。-finalizerinfo打印正等候回收的对象的信息。-heap打印heap的概要信息,GC使用的算法,heap的配置及wiseheap的使用情况。-histo[:live]打印每个class的实例数目、内存占用、类全名信息。VM的内部类名字开头会加上前缀”*”。如果live子参数加上后,只统计活的对象数量。-permstat打印classload和jvmheap长久层的信息,包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量。另外,内部String的数量和占用内存数也会打印出来。-F强迫。在pid没有相应的时候,使用-dump或者-histo参数。在这个模式下,live子参数无效。-h
-help打印辅助信息。-J传递参数给jmap启动的jvm。例如:
使用jmap-heappid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况:
jmap-heappid查看进程堆内存使用jmap-histo[:live]pid查看堆内存中的对象数目、大小统计直方图。
jstat:jvm统计信息监控工具
jstat是用于虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、jit编译等运行数据,它是线上定位jvm性能的首选工具。
命令格式:
jstat[generalOption
outputOptionsvmid[interval[s
ms][count]]]
generalOption:单个的常用的命令行选项,如-help,-options,或-version。outputOptions:一个或多个输出选项,由单个的statOption选项组成,可以和-t,-h,and-J等选项配合使用。常用选项:
class:用于查看类加载情况的统计,jstat-classpid:显示加载class的数量,及所占空间等信息。