日常运维之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
常见的垃圾回收器:
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;