写点什么

week9. 课后作业

发布于: 2020 年 08 月 02 日



  • 请简述 JVM 垃圾回收原理。



JVM垃圾回收指将JVM堆中已经不再使用的对象清理掉,释放宝贵的内存资源。

通过可达性分析算法识别垃圾对象。该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记的对象都是被使用的对象,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达,就是可回收的垃圾对象了。

在Java语言中,可作为GC Roots的对象包含以下几种

第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象

第二种是我们在类中定义了全局的静态的对象,也就是使用了static关键字

第三种便是常量引用,就是使用了static final关键字

第四种本地方法栈中(Native方法)引用的对象

回收方法

清理:将垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里。当应用程序需要创建对象时,从空闲列表里找一段空闲内存分配给次对象。容易产生碎片

压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么剩余的内存就算连续的空闲空间

复制:将堆空间分为两部分,只在一部分中创建对象,当这部分空间用完时,将标记过的可用对象复制到另一个空间中。



分代垃圾回收

Java将堆内存分为新生代、老年代。其中新生代分为Eden区、From区、To区。应用中大部分对象生命周期极短,创建的对象放在Eden区+From区,当Eden区+From区满了之后触发一次Yong GC,把其中存活的对象拷贝到To区,其余的对象清理掉,对存活的对象生存年龄加一,From区就是空的。下次Eden区+To区满了之后,会将对象拷贝到From区,对存活的对象生存年龄加一,To区就是空的。多次垃圾回收后,当对象的生命周期达到一定数量【默认15】之后会将对象放到老年代。老年代满了之后会触发Full GC,比较慢。

通常新生代比老年代小很多,新生代小,垃圾回收的速度会快很多。



垃圾回收器

串行回收器在早期单CPU机器时使用,垃圾回收时,停止应用访问【STW】,垃圾回收完成后恢复使用。这种单线程的机制是最高效的,多线程是没有意义的。

并行回收器在多核CPU时使用,并行垃圾回收,STW时间更短。但程序还是会不能响应,对用户体验不好。

并发回收器CMS-concurrent marks sweep.应用程序的线程和垃圾回收线程并行执行。应用程序在使用时垃圾回收标记是不可能标记完,所以还是需要STW,但分为四个流程后,STW时间就变短了。清理也是并发清理,对用户影响较小。

Java1.7之后主推G1垃圾回收器

默认将堆分为2000个小区域,这样回收的速度会更快,使用简单,使用的参数也少,比CMS少很多



  • 设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?

挑战和问题包括:高并发、网络带宽耗尽、服务器Load飙高,停止响应、数据库瘫痪、跳过秒杀页面、

高并发

首页用户访问量大,应该使用搜索引擎进行个性化展示或者使用静态页面。减少请求到达数据库。降低数据库压力。

并发控制,防秒杀器。设置阀门,只放最前面的一部分人进入秒杀系统,系统的并发会远小于系统在线抢购人数。

简化流程,砍掉不重要的分支流程,如下单页面的所有数据库查询。以下单成功作为秒杀成功标志,支付流程只要在一天内完成即可。采用内存缓存相关数据。

静态化 采用JS将动态页面转换为静态页面。

网络带宽耗尽

增加审核机制,新增的图片流量小于现有流量30%。

带宽准备 图片网络带宽估算,通过CDN准备 租用CDN

跳过秒杀页面

防跳过秒杀页面,直接进入下单页面,下单。导致秒杀失败。保证在秒杀开始前用户看不到下单页面的url

计算资源消耗

服务器准备,图片服务器集群、静态服务器集群、交易服务器集群。。。

前端优化 采用YSLOW原则提升页面响应速度

应急预案

域名分离、独立域名,不影响原有业务。

机动服务器备用,做好准备随时将非核心应用机器的冗余服务器下线,加入秒杀集群。

流量耗尽后,可以关掉非核心集群。

设计万能出错页面,任何出错都302跳转到此页面。此页面位于另外的集群。



发布于: 2020 年 08 月 02 日阅读数: 52
用户头像

做一个真诚、坦诚的行人,追求自由。 2018.07.30 加入

还未添加个人简介

评论

发布
暂无评论
week9.课后作业