你应该知道的 JVM-垃圾回收 基础知识

本文介绍了Java垃圾回收的基本原理,包括引用计数法和可达性分析算法,并详细阐述了老年代中无用类的判断标准。同时,讨论了三种垃圾回收算法:标记-清除、标记-整理和复制算法,及其优缺点。对于垃圾收集器,提到了Serial、ParallelScavenge、ParNew和CMS等,特别强调了CMS的并发标记过程和可能出现的问题。最后,简要说明了分代模型与分区模型在垃圾回收策略上的区别。

垃圾回收区域:

垃圾定位算法:

1.引用计数法;栈中有几个引用指向堆中的对象,则此对象计数为几。但是这种无法解决循环依赖的问题,故基本上不采用此方法

2.可达性分析算法:根据GC roots对象作为起点,向下搜索到的引用的对象,都属于非垃圾对象,其余都是垃圾对象。

                               GC roots:虚拟机栈(栈帧中的本地变量表)中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法栈中JNI(即一般说的Native方法)引用的对象。(引自《深入java虚拟机》)

 

在老年代中(又称永久代,hotSpot的方法区),类需要同时满足下面3个条件才能算是“无用的类”:

  • 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader(类加载器)已经被回收。
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

 

垃圾回收算法:

1.标记-清除算法:Mark-sweep

                         优点:快

                         缺点:内存碎片化

2.标记-整理算法 Mark-compact

                         优点:内存有序

                          缺点:慢

3.复制算法: copying

                      优点:没有碎片内存

                      缺点:浪费空间

                                                                     常用垃圾收集器

                               jdk1.8及之前:分代模型                                                                                                                      jdk1.9及之后:分区模型

                                      

分代模型:

 

老年代收集算法

是否并发收集

是否发生STW

备注

Serial & Serial Old

标记-整理

 

Parallel Scavenge & Parallel Old

标记-整理

 

ParNew & CMS(ConcurrentMarkSweep )

标记-清除

视步骤而定

步骤:

初始标记(STW)->

并发标记->

重新标记(STW)->

并发清理

注:

  1. CMS在并发清理时,此时用户线程是可执行,若此时老年代内存已满,则会发生错误,所以会采用serial-Old作为备用方案;
  2. CMS之所以会有三次标记,是因为并发标记时,用户线程可执行,此时的垃圾对象是不准确的,有漏标和浮动垃圾;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值