介绍在生产环境中,我们经常会遇到各种奇怪的性能问题,因此掌握最基本的JVM命令行监控工具是很有必要的。快照jmap导出堆内存镜像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用于分析heapdump文件jps:查看运行的Java进程Class(MainClass,main()函数所在的类)name和进程ID“如果你想看到一个命令,在它后面添加-help参数”[root@VM-0-14-centos~]#jps-helpusage:jps[-help]jps[-q][-mlvV][]Definitions::[:]「可以看到可以监控远程服务,但是基于安全考虑,一般不使用」常用选项如下。选项-q只输出进程id-m输出传递给主类main函数的参数-l输出主类的完整类名,如果进程执行的是Jar包,则输出jar包的名称-vjvmparametercis@mt002:~$jps70208KmpService183525LinkAnalysisServer25160MipSerachServercis@mt002:~$jps-l70208com.st.kmp.main.KmpService183525com.st.cis.main.LinkAnalysisServer25160com.Mjcis.printThreadsnapshot查看一个中所有线程的状态Java进程一般用于定位线程长期停顿的原因,如死循环、死锁、长期请求外部资源等!"(String[]args){ThreadthreadA=newThread(()->{synchronized(lockA){try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("getlockA");同步(lockB){System.out.println("threadArunfinish");}}});ThreadthreadB=newThread(()->{synchronized(lockB){try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("getlockB");同步(lockA){System.out.println("threadBrunfinish");}}});threadA.setName("myThreadA");threadB.setName("myThreadB");threadA.start();threadB.start();}}"我写了一个死锁的例子,启动后执行jps找到进程id是19457"peng@pengdeMacBook-Pro~%jps19457DeadLockDemo19458Launcher265819459Jps然后执行下面的命令,里面列出了这个进程中各个线程的执行状态。等,其中myThreadA和myThreadB的线程状态为BLOCKED,最后提示死锁位置“jmap:exportheapmemoryimagefile”jmap主要用于导出堆内存映像文件,查看是否有内存泄漏等”在生产环境中,我们一般会配置如下参数,让虚拟机在出现OOM异常后自动生成dump文件-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/Users/peng执行以下命令手动获取dump文件jmap-dump:file=filename.dumpprocessid》分析堆内存的工具有很多,如JavaVisualVM、jhat等,但我个人认为最好的是EclipseMemory分析器,都没有。”jstat:查看jvm统计信息“jstat可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾回收、JIT编译等运行数据。”使用jstat查看类加载信息。就个人而言,我很少使用这个命令。在命令行查看垃圾回收信息不如在图形界面查看方便,就不多介绍了。[root@VM-0-14-centos~]#jstat-class19402LoadedBytesUnloadedBytesTime1022919679.15276.05.33意思如下Loaded说明Loaded加载类的个数Bytes加载类的字节数Unloaded卸载类的个数Bytes字节数ofunloadedclasses所用时间jinfo:实时查看和修改jvm配置参数jinfo的作用是实时查看和修改虚拟机的各种参数。《使用jps命令的-v参数查看虚拟机启动时显式指定的参数列表》,但是如果想知道没有显式指定的参数的系统默认值,可以除了查找信息外,只使用jinfo。查询-flag选项(如果限于JDK1.6以上,使用java-XX:+PrintFlagsFinal查看参数默认值也是不错的选择)》jinfoflagspid只能正常使用在更高版本,而我在jdk1.8这个版本不能正常使用。”应用设置如下参数-Xmx10m-Xms10m查看最大堆内存和是否打印GC日志,可以看到GC日志没有打印然后设置打印GC日志,再次查看,打印GC日志peng@pengdeMacBook-Pro~%jinfo-flagMaxHeapSize20253-XX:MaxHeapSize=10485760peng@pengdeMacBook-Pro~%jinfo-flagPrintGCDetails20253-XX:-PrintGCDetailspeng@pengdeMacBook-Pro~%jinfo-flag+PrintGCDetails20253peng@pengdeMacBook-Pro~%jinfo-flag2:PrintGCDetails2:025GCDetails+PrintGCDetails《Xmx是MaxHeapSize的别名》本文转载自微信公众号“Java知堂”,可通过以下二维码关注。转载本文请联系Java石塘公众号。