日常运维之JVM GC

垃圾回收:

   Garbage Collection  (GC ) ,指对JVM 堆空间,没有任何引用的一个对象或者多个对象(循环引用)进行回收的过程。由于Java是系统自动对引用进行回收,顾无需开发人员过多考虑回收,反过来也会出现程序上的内存泄漏和内存溢出的情况。

内存泄漏:

是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 

内存溢出:

指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。 

JVM定位垃圾的方法:

采用标记法或者根可达方法进行遍历识别是否是垃圾。

JVM GC的算法:

1、标记清除法,会产生碎片,回收后的地址不连续。

2、拷贝算法,没有碎片,但是会浪费内存空间。

3、标记压缩法,没有碎片,地址连续,但是效率偏低。

JVM 堆内存分代模型(分代回收垃圾算法):

1、部分垃圾回收器,会采用分代垃圾回收算法;

2、JDK1.8,采用堆内存=新生代+老年代+元空间(永久代1.6/1.7)

其中元空间装载.class,大小不受限制,可以设置空间大小,不设置则受限于物理内存大小。

注:字符串 1.6 存储在永久代,1.8JDK存储在堆空间。

3、新生代=Eden + 2个 suvivor区,GC过程大致如下:

    第一次YGC回收之后,大多对象被回收,活着的进入s0区;再次YGC之后,大多对象被回收,Eden的活着对象+s0活着的对象 ==》s1;再次YGC之后,大多对象被回收,Eden的活着对象+s1活着的对象 ==》s0,依次类推~;当年龄(GC次数 CMS 15次)到达一定值之后将会===》老年代;

4、老年代,存放顽固的对象,当老年代满了之后,会触发Full GC ,(Full GC= YGC+OLD GC+元数据区GC);

另外名词:MinorGC= YGC      MajorGC = OLD GC

优化的目标就是尽量减少FullGC

常见的垃圾回收器:

日常运维之JVM GC

日常运维之JVM GC

1、Serial 年轻代回收,串行回收;

2、Parallel Scavenge 年轻代,并行回收;

3、ParNew 年轻代,配合CMS使用;

4、Serial Old 老年代回收,串行回收;

5、Parallel Old 老年代回收,并行回收;

6、CMS (ConcurrentMarkSweep),老年代并发,垃圾回收和应用程序同时运行,降低STW(Stop the world)时间;

7、G1 回收时间缩短到10ms

1.8默认回收器,Parallel Scavenge+ Parallel Old;

参考图:

日常运维之JVM GC