GC gc 垃圾回收机制

GC算法概述

引用计数法 添加引用(计数器) 如果有引用就+1 该对象 引用失效时 计数器-1 任何时刻 计数器为0就是不可用的 (判断效率高 但是对象之间的循环 难解决)
可达性算法 判断对象是否存活 GC Roots 对象作为起始点 开始向下搜索 当一个对象没有GC Roots时没有(引用链)相连接时 对象不可用 判定为可清除对象

标记清除算法 直接标记清除 效率不高 空间产生大量碎片


复制算法 把空间分成俩块 每次只对其中一块进行GC 当内存使用完时 将存活对象复制到另一块上 没必要 1 : 1 划分
会造成空间利用率低下。
针对新生代的复制算法
因为大多数新生代对象都不会熬过第一次 GC
采用一种分配担保策略:多出来的对象直接进入老年代。


标记-整理算法
不同于针对新生代的复制算法,针对老年代的特点,创建该算法。主要是把存活对象移到内存的一端。
将长时间不用的对象 去除


分代回收
根据存活对象划分几块内存区,一般是分为新生代和老年代。
然后根据各个年代的特点制定相应的回收算法。

新生代
每次垃圾回收都有大量对象死去,只有少量存活,选用复制算法比较合理。


老年代
老年代中对象存活率较高、没有额外的空间分配对它进行担保。
所以必须使用 标记 —— 清除 或者 标记 —— 整理 算法回收。


垃圾回收器
(收集算法)是内存回收的理论,而垃圾回收器是内存回收的实践。如果两个收集器之间存在(连线)说明他们之间可以搭配使用


Serial 收集器
这是一个单线程收集器。意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,
并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束。

ParNew 收集器
可以认为是 Serial 收集器的多线程版本

Parallel
指多条垃圾收集线程并行工作,此时用户线程处于等待状态

CMS 等收集器的关注点是尽可能地缩短垃圾收集时用户线程所停顿的时间,
而 Parallel Scavenge 收集器的目的是达到一个可控制的吞吐量
作为一个吞吐量优先的收集器,虚拟机会根据当前系统的运行情况收集性能监控信息,
动态调整停顿时间。这就是 GC 的自适应调整策略

 

 

 

主要问题
gc 有哪些垃圾回收算法?

标记清除算法 直接标记清除 效率不高 空间产生大量碎片

标记-整理算法
不同于针对新生代的复制算法,针对老年代的特点,创建该算法。主要是把存活对象移到内存的一端。
将长时间不用的对象 去除


复制算法 把空间分成俩块 每次只对其中一块进行GC 当内存使用完时 将存活对象复制到另一块上 没必要 1 : 1 划分
会造成空间利用率低下。
针对新生代的复制算法
因为大多数新生代对象都不会熬过第一次 GC
采用一种分配担保策略:多出来的对象直接进入老年代。

分代回收
根据存活对象划分几块内存区,一般是分为新生代和老年代。
然后根据各个年代的特点制定相应的回收算法。

新生代
每次垃圾回收都有大量对象死去,只有少量存活,选用复制算法比较合理。


老年代
老年代中对象存活率较高、没有额外的空间分配对它进行担保。
所以必须使用 标记 —— 清除 或者 标记 —— 整理 算法回收。

 

posted @ 2019-07-22 21:31  丛林绝境  阅读(167)  评论(0编辑  收藏  举报