JDK自带工具查看内存
今天维护之前写的一个项目,在本地跑一会出现java.lang.OutOfMemoryError: PermGen space
所以这里说一下怎么解决这个问题,以及如何查看内存使用情况,虚拟机的其他情况其他的地方说。
PermGen space 全称是Permanent Generation space ,是指内存的永久保存区域
这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行预编译的时候。
命令行模式
1.首先通过jps 查看java进程,可以找到对应的pid,通过pid可以进行查看当前进程的内存使用情况
2.jstat -gccapacity 4316[进程pid] 查看vm中内存对象的使用和占用大小。
PGCMN显示最小的perm的内存,PGCMX显示最大的perm的内存,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。
jstat -gcutil 4316 是查看GC汇总统计。P是perm占用比。
这两个命令只是简单的查看内存运行情况,能知道运行的大概情况
jstat -gcutil 4316 10000[ms] 6[次] 一定时间执行一次查看内存情况,可以通过操作下程序观察内存情况
jstat命令是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。
3.jps -v 查看进程的jvm参数
4.输入jmap -heap 5628[pid]可以查看内存使用情况
这种比上面那些命令我觉得更直观方便些。这里看到MaxPermSize最大才82M,后面会进行修改,内存溢出问题就解决了
图形界面模式
1.jconsole
在cmd输入jconsole可以查看进程的内存使用情况,也可以在bin目录中找到这个程序,jconsole是jdk自带的内存分析工具
2.jvisualvm
在cmd输入jvisualvm可以进入jdk另外一个自带的内存分析工具,也可以在bin目录中找到这个程序,可以看做是jconsole的升级版,可以分析dump
[外链图片转存失败(img-G6mguxPV-1564584979185)(file:///C:/Users/hejiahao/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]
jmap -dump:format=b,file=xxxx.dump[文件名,*.hprof也行] 4316[pid]生成对应进程的dump文件,可以通过jvisualvm打开dump查看情况。点击文件–>装入–>文件类型选dump。Dump里面可以查看哪些类占用的资源较多
在eclipse中的运行配置中添加运行参数,-XX:+HeapDumpOnOutOfMemoryError是当发生内存溢出的时候生成dump文件,然后可以使用jvisualvm打开文件进行分析。
修改后可以输入jmap -heap pid可以看到我们修改的地方已经改变
当然也可以在jvisualvm中查看改变的情况