jvm的堆内存被分为2部分:年轻代和老年代
年轻代:
这里是所有新对象产生的地方.当年轻代内存空间被用完的时候就会触发垃圾回收.这个垃圾回收叫做Minor(年轻的) GC
.年轻代被分为3个部分------Enden(终点)区和2个Survivor(幸存)区.
老年代:
老年代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象,通产会在老年代内存被沾满的时候进行来回收.
老年代GC-----Major GC
老年代的垃圾回收叫做Major GC,Major GC通常是跟full GC等价的,收集整个GC堆.
分代GC
Young GC :只收集年轻代的GC
Old GC: 只收集年老代的GC (只有CMS的concurrent collection是这个模式)
Mixed GC :收集整个young gen以及部分的old gen的GC(只有G1有这个模式)
Full GC
Full GC定义就很明确,就是针对整个新生代,老年代,元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC.
首先肯定要安装jdk环境的,这里就不说怎么安装了.
直接cmd命令行中敲jvisualvm就出来了.(我是windows环境mac也是一样的)
至于左边哪个pid才是自己的java进程呢,我是wondows,可以在cmd中使用netstat -ano | findstr "你的tomcat端口"
找到那个pid,然后双击后,点击监视就可以查看信息了
同时jvisualvm还可以安装插件,比如visual gc
在工具插件中安装visual gc,直接下一步下一步安装完
然后关闭当前的标签,重新双击左边对应的pid进程,会发现多出来一个visual gc的标签,通过这个插件就可以很形象的看到老年代,年轻代及年轻代中的Eden区和2个survior区了
然后用mat去分析一下
https://www.eclipse.org/mat/downloads.php
点击file然后open head dump,就是打开之前dump下来的那个文件
打开之后是这样的
点击detail就可以看到具体的信息
然后在高亮的那个线程就是目标线程,点击后查看线程的明细
这里就可以看到对战信息及代码的位置了
服务器上的话
可以使用 jmap -dump:format=b,file=
或者在tomcat中加上下面的参数,oom的时候会自动导出文件到指定路径
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/XXX/XXX/heapDump -Dfile.encoding=UTF8