简述 JVM 垃圾回收原理

用户头像
一叶知秋
关注
发布于: 2020 年 08 月 03 日



Java GC主要做三件事:

1、哪些内存需要GC?

Java GC针对的是JVM中堆和方法区。

程序计数器、虚拟机栈、本地方法栈是每个线程私有内存空间,随线程而生,随线程而亡,无需考虑回收。

GC主要进行回收的内存是JVM中的方法区和堆,涉及到多线程(指堆)、多个对该对象不同类型的引用(指方法区)

2、何时需要执行GC?

Java GC垃圾回收机制,回收的是已死的Java对象(引用无法可达)。

Java GC机制启动之前,需要确定堆内存中哪些对象是存活的,一般有两种方法:引用计数法和可达性分析法。

引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。引用计数法实现简单,判定高效,但不能解决对象之间相互引用的问题。

可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

3、以何策略执行GC?

分代分配,分代回收。

GC分代回收算法假设:绝大部分对象的生命周期都非常短暂,存活时间短。

把Java堆分为新生代和老年代,在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法;老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

GC优化两个目的:

将转移到老年代的对象数量降到最少。减少被移到老年代空间的对象数量,可能被误解为将对象留在新生代。但是,这是不可能的。取而代之,你可以调整新生代空间的大小。

减少Full GC的执行时间。



二、设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?

系统可能会因为1%的秒杀业务影响其余99%正常业务的运行,所以需要将秒杀系统独立出来。

主要解决两个问题:并发读、并发写。

思路:

页面彻底动静分离,使得用户秒杀时不需要刷新整个页面,降低刷新请求数。

服务器缓存秒杀商品,直接调用缓存层,无需穿透到数据库层找数据。

增加流量限流保护。



关键:秒杀系统最重要要求是 "不要超卖",关键在于减库存。

下单减库存:一定不会出现超卖情况,但是有些人下单完不付款会影响其他人。

付款减库款:付款减库存,可能会因为并发高导致付款时已经卖光,付不了款。

预扣库存:最常用,如下单后扣库存,保留十分钟,在十分钟内未付款就不保留。如果付款时发现库存不足则不允许付款。



设计Plan B兜底方案



用户头像

一叶知秋

关注

还未添加个人签名 2018.05.13 加入

还未添加个人简介

评论

发布
暂无评论
简述 JVM 垃圾回收原理