ReviewForJob——java虚拟机的垃圾回收策略(个人总结)

理解jvm的垃圾回收策略,需要解决以下3个问题
问题1:哪些内存需要回收?
问题2:什么时候进行回收?
问题3:怎样来回收?

【解决问题1】哪些内存需要回收?
jvm的内存区域有5大块:
1)程序计数器:线程私有,用于记录 当前线程所执行class 字节码的行号计数器;
2)java 虚拟机栈:线程私有,指java 方法执行的 内存模型;
3)本地方法栈:线程私有,指java 本地方法执行的 内存模型;
4)java堆:线程公有,用于存储所有对象实例 和 数组;
5)方法区:线程公有,用于存储编译后的 类信息(Class类),常量,静态变量 和 即时编译后的数据;
显然,线程公有的内存区域需要回收,即 java堆 和 方法区;
看个荔枝:以可达性分析算法为荔枝,来介绍哪些内存需要回收?
其基本思想就是通过称为“GC Root”的对象作为起点,点向下搜索,搜索所走过的路径称为引用链,但一个对象到GC Root没有任何引用链相连的话,则证明对象是不可用的;(这时可以考虑通过 相交集和非相交集算法来实现)
GC Roots的对象包括下面几种(Objects):
O1)虚拟机栈或本地方法栈中引用的对象;
O2)方法区中常量或类静态属性引用的对象;

【解决问题2】什么时候进行回收?
显然当 java堆或方法区的内存容量不足以满足class字节码运行时所需要的内存空间的时候,就需要进行内存回收(因为在运行期间,你不知道该字节码文件需要多少内存,多大内存);

【解决问题3】怎样来回收?这就不得不讲 垃圾回收算法了。
写在前面)java堆分为 老年代 和 新生代;对象首先分配在新生代Eden区中,当在新生代中经过若干次垃圾收集后,该对象如果还存在的话,就将其移入老年代进行存储;

算法1)标记-清除算法(回收老年代): 首先根据可达性分析标记处需要回收的对象;之后再统一回收所有被标记的对象;
缺点1:效率问题,标记和清除两个效率都不高;
缺点2:空间问题,标记清除之后会留下大量的内存碎片 以至于可能导致以后分配较大对象时,因为无法找到足够的连续内存而不得不提前触发来一次垃圾收集动作;

算法2)复制算法(回收新生代): 将jvm公共内存(主要是堆内存)划分为容量相等的两块A 和 B,每次只使用其中一块,如A 来进行运行时的内存分配;当块A要使用完的时候,将块A中的还存活的对象复制到 块B上,然后一次性回收块A中的使用空间。下一次就使用块B 来进行运行时的内存分配了,而块A的使用空间为零,即块A的所有空间可用(复制垃圾回收算法主要解决的问题是: 内存碎片问题
缺点1:该算法的代价是将内存缩小了一半;内存利用率低;


算法3)复制算法变体算法(回收新生代): 内存空间并不是像 算法2那样 1:1 的分配,而是将内存分为 一块 8个单位的称为 Eden空间的内存, 两块 1个单位的称为Survivor 空间的内存,记为A和B;每次只使用 Eden空间内存 和 其中一块Survivor空间 如A的内存;当 上述内存空间要使用完的时候,就把 Eden空间和 Survivor A 空间的对象复制到 Survivor B空间中,然后再清除 Eden空间 和 Survivor A 空间中的内存;下次运行时内存分配区域是 Eden空间 和 Survivor A空间;
那如果 上述过程中 Survivor B 无法储存 Eden 和 Survivor A 中的对象的时候,需要其他内存(老年代)进行 分配担保 ,即借用老年代的一部分内存空间来存储 Eden 和 SurvivorA 中的对象数据。

算法4)标记整理算法(回收老年代): 该算法类似于 标记清除算法,不同的是在清理阶段,让所有存活对象都向一端移动,然后直接清理内存边界以外的内存

算法5)算法综述—— 分代收集算法: 要知道 java堆内存分为 新生代 和 老年代;
新生代:新生代中,每次垃圾收集时都发现有大批对象时区,只有少量存活,选用复制算法;
老年代:因为老年代中 对象存活率高,没有额外空间对它进行分配担保,就必须使用 “标记-清理” 或 标记整理算法 进行回收;

【2】Minor GC 和 Full/Major GC
1)Minor GC(新生代GC):因为 对象首先分配在 java堆新生代中的 Eden空间,如果Eden空间不够用的话,就会进行一次 Minor GC;
2)Full/Major GC(老年代GC):大对象直接进入老年代(大对象就是需要大量连续内存空间的对象)
注意)Full/Major GC 比 Minor GC的速度至少慢10倍以上;所以能用Minor GC 解决问题 就不要用 Major GC;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值