jvm简单介绍和使用jdk的jvisualvm查看

年轻代和老年代

jvm的堆内存被分为2部分:年轻代和老年代

年轻代:
这里是所有新对象产生的地方.当年轻代内存空间被用完的时候就会触发垃圾回收.这个垃圾回收叫做Minor(年轻的) GC.年轻代被分为3个部分------Enden(终点)区和2个Survivor(幸存)区.

  1. 大多数新建的对象都位于Eden区
  2. 当Eden区满了就会Minor GC将不再被其他对象引用的对象进行销毁,然后把存活下来的对象移动到一个survior区.
  3. 如果这个survior区也满了就会再次Minor GC
    ,并将剩下存活的对象转移到另一个survivor区.这样在一段时间内总会有一个空闲的survivor区.
  4. 经过多次GC周期后,仍然存活下来的对象会被转移到老年代内存空间.通常这是在年轻代有资格提升到老年代前通过设定年龄阈值来完成的.

老年代:
老年代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象,通产会在老年代内存被沾满的时候进行来回收.

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.
jvm简单介绍和使用jdk的jvisualvm查看_第1张图片

使用JDK自带的jvisualvm分析jvm

首先肯定要安装jdk环境的,这里就不说怎么安装了.
直接cmd命令行中敲jvisualvm就出来了.(我是windows环境mac也是一样的)
至于左边哪个pid才是自己的java进程呢,我是wondows,可以在cmd中使用netstat -ano | findstr "你的tomcat端口"找到那个pid,然后双击后,点击监视就可以查看信息了
jvm简单介绍和使用jdk的jvisualvm查看_第2张图片

同时jvisualvm还可以安装插件,比如visual gc
在工具插件中安装visual gc,直接下一步下一步安装完
jvm简单介绍和使用jdk的jvisualvm查看_第3张图片

然后关闭当前的标签,重新双击左边对应的pid进程,会发现多出来一个visual gc的标签,通过这个插件就可以很形象的看到老年代,年轻代及年轻代中的Eden区和2个survior区了
jvm简单介绍和使用jdk的jvisualvm查看_第4张图片

然后用mat去分析一下
https://www.eclipse.org/mat/downloads.php

点击file然后open head dump,就是打开之前dump下来的那个文件
打开之后是这样的
jvm简单介绍和使用jdk的jvisualvm查看_第5张图片

问题它都帮我们分析出来了
jvm简单介绍和使用jdk的jvisualvm查看_第6张图片

点击detail就可以看到具体的信息
然后在高亮的那个线程就是目标线程,点击后查看线程的明细
jvm简单介绍和使用jdk的jvisualvm查看_第7张图片
这里就可以看到对战信息及代码的位置了
jvm简单介绍和使用jdk的jvisualvm查看_第8张图片

服务器上的话
可以使用 jmap -dump:format=b,file=

或者在tomcat中加上下面的参数,oom的时候会自动导出文件到指定路径

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/XXX/XXX/heapDump -Dfile.encoding=UTF8

jvm简单介绍和使用jdk的jvisualvm查看_第9张图片

你可能感兴趣的:(jdk,jvm)