GC基本知识

1.什么是垃圾

没有任何引用指向的一个对象,或多个对象(循环引用)

2.如何定位垃圾

引用计数法(无法解决循环引用)

根可达算法(通过根对象找不到的对象都是垃圾)

根对象:线程栈变量,引入的Class的静态变量,常量池和JNI指针引用到的变量

3.常见的垃圾回收算法

Mark-Sweep(标记清除):位置不连续,产生碎片

Copying(拷贝):没有碎片,浪费空间

Mark-Compact(标记压缩):没有碎片,效率偏低

4.JVM内存分代模型(用于分代垃圾回收算法)

1.部分垃圾回收器使用的模型

2.新生代+老年代+永久代(1.7) / 元数据区Metaspace(1.8)

永久代,元数据区区别:

都是装Class对象的

永久代必须指定大小限制。元数据区可以设置,也可以不设置,无上限(受限于物理内存)

字符串常量在1.7时是存放在永久代的,1.8则在堆里

3.新生代=eden区+2个survivor区

    1.YGC回收之后,大多数对象会被回收,活着的利用Copying算法进入survivor区(s0)

    2.再次YGC,活着的对象 eden+s0 ->进入s1

    3.再次YGC,活着的对象 eden+s1 ->进入s0

    4.年龄足够->进入老年代

    5.s区装不下->老年代

4.老年代

    老年代满了会触发一次FGC(Full GC)

5.GC Tuning(分代算法)

    1.尽量减少FGC

MinorGC = YGC

MajorGC = FGC

5.常见的垃圾回收器

1.Serial:串行回收,单线程(新生代)

2.Parallel Scavenge:并行回收,多线程(新生代)

3.ParNew:配合CMS的并行回收(新生代)

4.Serial Old(老年代)

5.Parallel Old(老年代)

6.CMS(ConcurrentMarkSweep)(老年代)

JDK1.8默认的垃圾回收器:Parallel Scavenge + Parallel Old

发布了48 篇原创文章 · 获赞 1 · 访问量 2819

猜你喜欢

转载自blog.csdn.net/Forest24/article/details/102649268