架构师训练营 week09
JVM 垃圾回收
垃圾回收技术
方法一:引用计数法。简单但速度很慢。缺陷是:不能处理循环引用的情况。
方法二:停止-复制(stop and copy)。效率低,需要的空间大,优点,不会产生碎片。
方法三:标记 - 清除算法 (mark and sweep)。速度较快,占用空间少,标记清除后会产生大量的碎片。
JAVA 虚拟机中是如何做的?
java 的做法很聪明,我们称之为"自适应"的垃圾回收器,或者是"自适应的、分代的、停止-复制、标记-清扫"式垃圾回收器。它会根据不同的环境和需要选择不同的处理方式。
heap 组成
由于 GC 需要消耗一些资源和时间的,Java 在对对象的生命周期特征进行分析后,采用了分代
的方式来进行对象的收集,即按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短 GC 对应用造成的暂停.
heap 的组成有三区域/世代:(可以理解随着时间,对象实例不断变换 heap 中的等级,有点像年级)
新生代 Young Generation
Eden Space 任何新进入运行时数据区域的实例都会存放在此
S0 Suvivor Space 存在时间较长,经过垃圾回收没有被清除的实例,就从 Eden 搬到了 S0
S1 Survivor Space 同理,存在时间更长的实例,就从 S0 搬到了 S1
旧生代 Old Generation/tenured
同理,存在时间更长的实例,对象多次回收没被清除,就从 S1 搬到了 tenured
Perm 存放运行时数据区的方法区
Java 不同的世代使用不同的 GC 算法。
Minor collection:
新生代 Young Generation 使用将 Eden 还有 Survivor 内的数据利用 semi-space 做复制收集(Copying collection), 并将原本 Survivor 内经过多次垃圾收集仍然存活的对象移动到 Tenured。
Major collection 则会进行 Minor collection,Tenured 世代则进行标记压缩收集。
To note that:
这个搬运工作都是 GC 完成的,这也是 garbage collector 的名字来源,而不是叫 garbage cleaner. GC 负责在 heap 中搬运实例,以及收回存储空间。
GC 工作原理
JVM 分别对新生代和旧生代采用不同的垃圾回收机制
何为垃圾?
Java 中那些不可达的对象
就会变成垃圾
。那么什么叫做不可达?其实就是没有办法再引用
到该对象了。主要有以下情况使对象变为垃圾:
1.对非线程的对象
来说,所有的活动线程都不能访问该对象,那么该对象就会变为垃圾。
2.对线程对象来说,满足上面的条件,且线程未启动或者已停止。
JVM 中将对象的引用分为了四种类型,不同的对象引用类型会造成 GC 采用不同的方法进行回收:
(1)强引用:默认情况下,对象采用的均为强引用
(GC 不会回收)
(2)软引用:软引用是 Java 中提供的一种比较适合于缓存场景的应用
(只有在内存不够用的情况下才会被 GC)
(3)弱引用:在 GC 时一定会被 GC 回收
(4)虚引用:在 GC 时一定会被 GC 回收
秒杀系统挑战与问题,方案与思路
挑战是高并发怎么做,如何阻止调到秒杀界面;
平时几百台服务器,怎么一下子扩容 100 倍,单个系统与原来系统是隔离的,这样避免与老系统扩展。开发一个软件。
主要分为三个方面,服务器准备(style 服务器、图片服务器、静态服务器、图片服务器),新老系统隔离,网络准备,CDN 准备。界面准备(商品列表,商品详情,支付界面)
静态化(静态化页面自动化生成)
并发控制(并发控制设计,三道阀门设计)
简化流程(数据库连接砍掉,秒杀精简,内容缓存,JVM 优化)
前段优化(图片压缩、内容压缩,CSS 精简)
应急预案(独立域名、CDN 隔离)
采用更轻量级(快速的)服务器。
评论