写点什么

架构师训练营 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