jps 虚拟机状态工具
主要功能:可以列出正在运行的虚拟机(java)进程情况及其id(和linux中ps类似),显示虚拟机执行主类main函数所在的类,这些进程的本地虚拟机唯一ID
部分选项:
-q:只输出LVMID 省略主类的名称
-m:输出虚拟机进程启动时传给主类main()函数的参数
-l:输出主类的全类名如果进程执行的是Jar包输出Jar路径
-v:输出虚拟机进程启动时JVM参数
命令格式:jps [option] [hostid]
执行样式一:-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
执行样式二:-v 输出传递给JVM的参数 在这里,在启动main方法的时候,我给jvm传递一个参数:-Dfile.encoding=UTF-8,执行jps -v:
jps 命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。
jps是我最常用的java命令。使用jps可以查看当前有哪些Java进程处于运行状态。如果我运行了一个web应用(使用tomcat、jboss、jetty等启动)的时候,我就可以使用jps查看启动情况。有的时候我想知道这个应用的日志会输出到哪里,或者启动的时候使用了哪些javaagent,那么我可以使用**jps -v** 查看进程的jvm参数情况。
jmap 内存映像工具
分析内存泄漏最常用命令之一。
主要功能:打印指定java进程(或核心文件、远程调试服务)的共享对象内存映射或堆内存细节。获取堆转储快照 ,生成Heap Dump。
查询finalize执行队列
查询java堆和永久代的详细信息(如空间使用率、当前使用的收集器)
常见的内存错误:
* outOfMemoryError 年老代内存不足。
* outOfMemoryError:PermGen Space 永久代内存不足。
* outOfMemoryError:GC overhead limit exceed 垃圾回收时间占用系统运行时间的98%或以上。
**Jmap****最常用的分析命令:**
一、[root@ ~]# **jmap -heap 31846 *该命令用来*查看java 堆(heap)使用情况。**
二、[root@ ~]# **jmap -histo 3331 **查看堆内存(histogram)中的对象数量及大小。
jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。
三、[root@ ~]# jmap -dump:format=b,file=heapDump 6900 **将内存使用的详细情况输出到文件。
然后用**jhat****命令可以参看 ****jhat -port 5000 heapDump** 最后在浏览器中就可以访问:**http://localhost:5000/** 查看详细信息。
总结:
1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
2.要制作堆Dump可以直接使用jvm自带的jmap命令。
3.可以先使用jmap -heap命令查看堆的使用情况,看一下各个堆空间的占用情况。
4.使用jmap -histo:[live]查看堆内存中的对象的情况。如果有大量对象在持续被引用,并没有被释放掉,那就产生了内存泄露,就要结合代码,把不用的对象释放掉。
5.也可以使用 jmap -dump:format=b,file=命令将堆信息保存到一个文件中,再借助jhat命令查看详细内容
6.在内存出现泄露、溢出或者其它前提条件下,建议多dump几次内存,把内存文件进行编号归档,便于后续内存整理分析。