Java1.8-GC基础

154 阅读2分钟

什么是垃圾

一个或多个对象没有任何引用指向它,这个(这些)对象就是需要回收的垃圾

如何定位垃圾

>引用计数算法(无法解决循环引用)
>根可达算法(根搜索算法):
     根对象包含:线程栈变量,静态变量,常量池,JNI指针

常见的垃圾回收算法

> Mark-Sweep(标记清除): 回收后位置不连续,产生碎片
> Copying(拷贝): 没有碎片,但是浪费空间
> Mark-Compact(标记压缩):没有碎片,由于会对内存空间进行整理,相比于其他2种算法效率偏低

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

> 部分垃圾回收器使用的模型
> 年轻代 + 老年代 +【永久代(1.7)/元数据区(1.8,MeataSpace)】
    > 永久代/元数据区存储class
    > 永久代必须指定大小限制,元数据没有限制(受限于物理内存) 
    > 字符串常量: 1.7-永久代,1.8-堆
    > 方法区(MethodArea)是逻辑概念: 1.7:永久代, 1.8:元数据区

> 年轻代: Eden + s0 + s1,YGC/YOUNG GC/Minor GC    > YGC回收之后大多数对象会被回收,活着进入Survivor区
    > 首次YGC: Eden -> S0
    > 再次YGC:Eden + s0 -> s1
    > 再次YGC:Eden + s1 -> s0
    > 再次YGC:Eden + s0 -> s1 ,......循环往复    > 年龄足够/Survivor区装不下 -> 老年代> 老年代
    > 顽固分子
    > 老年代满了 FGC/FULL GC/Major GC
> GC Tuning(Generation): 尽量减少Full GC

常见的垃圾回收器

分代垃圾回收器-年轻代

Serial: a stop-the-world,copying collector which uses a single GC thread[stw,串行,拷贝算法]
ParallelScavenge: a stop-the-world,copying collector which uses multiple GC threads
                    [stw,并行,拷贝算法]ParNew: a stop-the-world,copying collector which uses a single GC threads
        It differs from "parallel scavenge" in that 
        it has echancements that make it usable with cms.
        [stw,并行,拷贝算法,配合老年代CMS使用]

 分代垃圾回收器-老年代

SerialOld: a stop-the-world,mark-sweep-compact collector that uses a single GC thread
        [stw,串行,标记压缩算法]
ParallelOld: a compacting collector that uses multiple GC threads
CMS(Coucurrent mark sweep): a mostly concurrent,low-pause collector;
        4 phases:inital mark, concurrent mark,remark,concurrent sweep
        [并发,垃圾回收和应用程序同时运行,降低stw的时间(官方号称可以到200ms)]

非分代垃圾回收器

G1: 10ms
ZGC: 零停顿,1ms,pk c++
Shennandoah: 与ZGC 二选一
Eplison

JVM调优 第一步,了解生产环境下的垃圾回收器组合

JVM参数分类:
    标准参数: -开头,所有HotSpot都支持
    非标准参数: -X开头,特定HotSpot版本支持
    不稳定参数: -XX开头,下个版本可能取消[java -XX:+PrintFlagsFinal]
查看jvm运行参数: -XX:+PrintCommandLineFlags
最终参数值: -XX:+PrintFlagsFinal
默认参数值: -XX:+PrintFlagsInitial

出处:www.bilibili.com/video/BV1UX…

==========================完============================