写点什么

架构作业 -- 第九周

用户头像
Nick~毓
关注
发布于: 2020 年 11 月 22 日

JVM垃圾回收原理

JVM垃圾回收:JVM堆中的已经不再被使用的对象(垃圾)清理掉(回收),释放宝贵的内存资源;

总计两个过程:垃圾识别 + 垃圾回收

垃圾识别(可达性分析算法)

无任何对象引用的对象;

GC root对象开始:在虚拟机的线程栈中的局部变量,或者方法区的静态变量出发,这些变量进行引用对象的标记,然后看这些对象是否引用了其他的对象,继续进行标记; 最终找出那些没有被标记的对象;



垃圾回收

几种常见的垃圾回收方法:



分代收集算法(Generational Collection):

Java 堆分为新生代老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

---新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

---老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理或者标记 — 整理算法来进行回收

内存模型和回收策略



新生代(Young generation):绝大多数最新被创建的对象都会被分配到这里,由于大部分在创建后很快变得不可达,很多对象被创建在新生代,然后“消失”。对象从这个区域“消失”的过程我们称之为:Minor GC 。



老年代(Old generation):对象没有变得不可达,并且从新生代周期中存活了下来,会被拷贝到这里。其区域分配的空间要比新生代多。也正由于其相对大的空间,发生在老年代的GC次数要比新生代少得多。对象从老年代中消失的过程,称之为:Major GC 或者 Full GC。

垃圾回收器算法



G1堆内存分配
G1回收流程

1)G1执行的第一阶段:初始标记(Initial Marking )

这个阶段是STW(Stop the World )的,所有应用线程会被暂停,标记出从GC Root开始直接可达的对象。



2)G1执行的第二阶段:并发标记

从GC Roots开始对堆中对象进行可达性分析,找出存活对象,耗时较长。当并发标记完成后,开始最终标记(Final Marking )阶段



3)最终标记

标记那些在并发标记阶段发生变化的对象,将被回收。



4)筛选回收

首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region。




秒杀系统

之前看到 走耳朵耗子 的 秒杀方案,基本也是CDN的边缘节点做流量的阀门控制;



主要的问题和挑战:

除了关注秒杀这样的场景,其实更多的还是关注 业务持续增长带来高并发和大流量,这才是架构真正核心挑战;



性能测试:一套指标系统,了解当前应用系统当前的处理能力,这是前提基础; 这件事情考虑的实际用户的请求特性,还是比较有挑战的任务;



具体优化方式就很多了:在架构的各个层面(前端、接入层、业务应用、中间件、存储层、lass层)都应该有相应的优化措施;



用户头像

Nick~毓

关注

还未添加个人签名 2018.05.09 加入

还未添加个人简介

评论

发布
暂无评论
架构作业--第九周