写点什么

简述 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 垃圾回收原理