写点什么

架构师训练营 week09

用户头像
FG佳
关注
发布于: 2020 年 11 月 22 日

JVM 垃圾回收

垃圾回收技术


方法一:引用计数法。简单但速度很慢。缺陷是:不能处理循环引用的情况。

方法二:停止-复制(stop and copy)。效率低,需要的空间大,优点,不会产生碎片。

方法三:标记 - 清除算法 (mark and sweep)。速度较快,占用空间少,标记清除后会产生大量的碎片。


JAVA 虚拟机中是如何做的?

java 的做法很聪明,我们称之为"自适应"的垃圾回收器,或者是"自适应的、分代的、停止-复制、标记-清扫"式垃圾回收器。它会根据不同的环境和需要选择不同的处理方式。


heap 组成


由于 GC 需要消耗一些资源和时间的,Java 在对对象的生命周期特征进行分析后,采用了分代的方式来进行对象的收集,即按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短 GC 对应用造成的暂停.

heap 的组成有三区域/世代:(可以理解随着时间,对象实例不断变换 heap 中的等级,有点像年级)


新生代 Young Generation

  1. Eden Space 任何新进入运行时数据区域的实例都会存放在此

  2. S0 Suvivor Space 存在时间较长,经过垃圾回收没有被清除的实例,就从 Eden 搬到了 S0

  3. 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.对线程对象来说,满足上面的条件,且线程未启动或者已停止。


例如: (1)改变对象的引用,如置为null或者指向其他对象。    Object x=new Object();//object1    Object y=new Object();//object2    x=y;//object1 变为垃圾    x=y=null;//object2 变为垃圾 
(2)超出作用域 if(i==0){ Object x=new Object();//object1 }//括号结束后object1将无法被引用,变为垃圾 (3)类嵌套导致未完全释放 class A{ A a; } A x= new A();//分配一个空间 x.a= new A();//又分配了一个空间 x=null;//将会产生两个垃圾 (4)线程中的垃圾 class A implements Runnable{ void run(){ //.... } } //main A x=new A();//object1 x.start(); x=null;//等线程执行完后object1才被认定为垃圾 这样看,确实在代码执行过程中会产生很多垃圾,不过不用担心,java可以有效地处理他们。
复制代码




JVM 中将对象的引用分为了四种类型,不同的对象引用类型会造成 GC 采用不同的方法进行回收:

(1)强引用:默认情况下,对象采用的均为强引用

(GC 不会回收)

(2)软引用:软引用是 Java 中提供的一种比较适合于缓存场景的应用

(只有在内存不够用的情况下才会被 GC)

(3)弱引用:在 GC 时一定会被 GC 回收

(4)虚引用:在 GC 时一定会被 GC 回收


秒杀系统挑战与问题,方案与思路


挑战是高并发怎么做,如何阻止调到秒杀界面;


平时几百台服务器,怎么一下子扩容 100 倍,单个系统与原来系统是隔离的,这样避免与老系统扩展。开发一个软件。

主要分为三个方面,服务器准备(style 服务器、图片服务器、静态服务器、图片服务器),新老系统隔离,网络准备,CDN 准备。界面准备(商品列表,商品详情,支付界面)

静态化(静态化页面自动化生成)

并发控制(并发控制设计,三道阀门设计)

简化流程(数据库连接砍掉,秒杀精简,内容缓存,JVM 优化)

前段优化(图片压缩、内容压缩,CSS 精简)

应急预案(独立域名、CDN 隔离)


采用更轻量级(快速的)服务器。


用户头像

FG佳

关注

还未添加个人签名 2019.11.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营week09