JVM GC机制笔记

1.几种GC垃圾收集算法(两个算法效率衡量标准:时间/空间)
1.1.标记-清除(Mark-Sweep)算法
*S1-扫描内存对象列表标记回收状态;S2-清除标记回收块内存
*时间o(n)/空间产生不连续的碎片内存块
1.2.复制(Copying)算法
*PRE1-内存分等大两个区域(U-使用中,P-待分配);S1-扫描U中不可回收对象并拷贝到P中;S2-擦除U中所有内存块
*HotSpot VM采用U:U:P = 8:8:1比例,意思是GC大概率不到10%的内存对象存活,超过10%的对象拷贝到另外一个U空间做分配担保
*时间o(n)内存拷贝耗时/空间不产生碎片,但会有一半内存无法使用
1.3.标记-整理(Mark-Compact)算法
*S1-类似于交换排序扫描中把不可回收内存前移;S2-擦除最后一个不可回收内存块后的所有数据
*时间o(n)简单交换排序可实现/空间不产生碎片
1.4.分代收集(Generational Collection)算法
*PRE1-分为新生代和老年代;PRE2-新生代多采用复制算法(可回收内存块多,内存开销大);PRE2-老年代多采用标记算法(可回收内存块少,碎片多)
*内存拷贝相较于读内存CPU耗时是倍数,所以尽量可以复用内存数据而不是直接拷贝一份
2.常用垃圾收集器(GC)
2.1.新生代(Young generation)
2.1.1.Serial-复制算法、单线程
*S1-用户线程暂停;S2-GC线程复制算法回收所有E,不可回收对象复制到S;S3-用户线程时间片;S4-暂停用户线程;S5-GC线程回收老年代
*用户线程于GC线程交替无交叉
*STW(Stop the world),停顿时长是衡量Serial收集器的最大指标
*N*10MB内存一次GC,STW在N*10ms左右
*配合老年代CMS、Serial Old(MSC)收集器使用
2.1.2.ParNew-复制算法、多线程
*GC流程和Serial同,只是S2多线程GC(Thread_Cnt一般等于CPU核心数)
*可以通过-XX:ParallelGCThreads参数限制Thread_Cnt
*配合老年代CMS、Serial Old(MSC)收集器使用
2.1.3.Parallel Scavenge-复制算法、多线程(关注吞吐量)
*吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
*多运用于Server服务器
*P-S收集器会自适应分配Eden和Survivor比例,来最大化VM的GC吞吐量
*三个可配值JVM参数:-XX:MaxGCPauseMillis(最大STW时长)、-XX:GCTimeRatio(吞吐量)、-XX:+UseAdaptiveSizePolicy(是否自适应)
*配合老年代Serial Old(MSC)、Parallel Old收集器使用
2.2.老年代(Tenured generation)
2.2.1.CMS(Conrrurent Mark Sweep)-标记清除、多线程
*S1-初始标记,STW 扫描GC可达;S2-并发标记;S3-重新标记 STW;S4-并发清除
*其中只有S1用时较短,S2&S4耗时最长但不需要暂停用户线程
2.2.2.Serial Old-标记整理算法、单线程(Serial的老年版本)
2.2.3.Parallel Old-标记整理算法、多线程
2.3.G1收集器
*区域(Region)划分:E(Eden)/S(Survivor)/O(Old)/H(Humongous)
*Region等容
*不同区域不做物理隔离
3.GC root是什么?ClassLoader?一个Thread对象?在《Java编程思想》对GC root的定义有以下介绍,它可以是
(1)虚拟机栈(栈帧中本地变量表)中引用的对象
(2)方法区中的类静态属性引用的对象
(3)方法区中常量引用的对象
(4)本地方法栈中引用的对象
*所以gc_root可以是一个类、是一个Thread对象、是一个JNI_Evn持有的Java对象等等
*Android的gc_root:ThreadLocal/Application ?
4.强引用、弱引用、软引用和虚引用
*强引用,不可GC
*软引用,在内存溢出前回收
*弱引用,一次GC回收
*虚引用,垃圾收集时会受到系统通知
5.finalize()方法-java.lang.Object protected
*当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值