JAVA垃圾回收判断、垃圾回收算法、垃圾回收器比较

如何判断垃圾

1, 引用计数法 (会有循环引用问题)

2,可达性分析算法(无法与GC Root建立直接或间接的连接)

GC Root有哪些
1,虚拟机栈中引用的对象,如:对象地址
2,方法区中类静态属性引用的对象,如:static变量
3,方法区中常量引用的对象,如:final static
4,本地方法栈中引用的对象,如:调用native,虚拟机只是简单地动态连接并直接调用指定的本地方法

垃圾回收算法

1,标记-清除算法(存在问题:内存碎片)

2,复制算法(等分两块,回收时,将活着的复制到另一块上)(存在问题:空间占用高)

3,标记-整理算法(先标记,回收时,将活者的移动到一端上)(存在问题:内存变动频繁,需整理所有活着对象,效率低)

4,分代收集(把Java堆分为新生代老年代,根据各个年代的特点采用最适当的收集算法)

1,在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用《复制算法》
(只需要付出少量存活对象的复制成本就可以完成收集)
2,在老年代中,对象存活率高、没有额外空间对它进行分配担保,就必须使用《标记-清理》或《标记-整理》

工作原理:

1.所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速的收集掉那些生命周期短的对象。

2. 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

3. 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收

4.新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

老年代

1.在老年代中存放的都是一些生命周期较长的对象。

2.老年代内存比新生代也大很多(大概比例是2:1),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久代(Permanent Generation)(在jdk新版本中,已经没有了永久代这个区域。)

用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

 

名词解释

吞吐量:CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值

停顿时间:垃圾回收,应用停顿时长

串行:垃圾回收线程运行,用户线程暂停

并发:用户线程 与 垃圾回收线程 交替运行

并行:用户线程 和多条 垃圾回收线程同时进行

垃圾回收器

新生代使用的收集器:Serial、PraNew、Parallel Scavenge

老年代使用的收集器:Serial Old、Parallel Old、CMS

1,Serial(单线程)(新生代垃圾回收器)(复制算法)(单CPU下,垃圾清除效率高)

2,ParNew(多线程)(新生代垃圾回收器)(复制算法)(根据CPU核数,开启不同的线程数)

3,Parallel Scavenge(多线程)(新生代垃圾回收器)(复制算法)(追求高吞吐量,高效利用CPU,吞吐量一般为99%)

吞吐量= 用户线程时间/(用户线程时间+GC线程时间)

1,Serial Old(单线程)(老年代垃圾回收器)(标记-整理算法)(常与Parallel Scavenge回收器配合使用)

2,Parallel Old(多线程)(老年代垃圾回收器)(标记-整理算法)(适合那些注重吞吐量和CPU资源敏感的场合)

3,CMS(多线程回收)(老年代垃圾回收器)(标记-清除算法)(高并发、低停顿,追求最短GC回收停顿时间)

(cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择)

G1 (多线程回收)(新生代和老年代垃圾回收器)(标记-复制算法)(逐渐替代CMS)

G1: 垃圾回收

Region 区域化垃圾收集器:最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可。

G1 整体采用标记-整理算法,局部是通过是通过复制算法,不会产生内存碎片

初始标记:标记一下GC Roots能直接关联到的对象,需要停顿线程,但耗时很短

并发标记:对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行

最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录

筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划

常用配置:
-XX:UseG1GC
-XX:G1HeapRegionSize=n:设置G1区域的大小,值是2的幂
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

CMS(四阶段:初始标记、并发标记:、重新标记:、并发清除)

初始标记(CMS-initial-mark) ,会导致stw;
并发标记(CMS-concurrent-mark),与用户线程同时运行;
预清理(CMS-concurrent-preclean),与用户线程同时运行;
可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行;
重新标记(CMS-remark) ,会导致swt;
并发清除(CMS-concurrent-sweep),与用户线程同时运行;
并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值