写点什么

week9 作业

用户头像
a晖
关注
发布于: 2020 年 08 月 05 日

1,JVM 垃圾回收原理



JVM 垃圾回收(Garbage Collection,通常被称为“GC”)就是将JVM堆中已经不再使用的对象清理掉,释放宝贵的内存资源。

JVM中,程序计数器、Java栈、本地方法 都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了内存的自动清理。而方法区中存放从磁盘加载进来的类字节码,Java堆中存放的是程序运行过程中创建的类实例。因此,内存的垃圾回收主要集中于Java堆和方法区中,程序运行期间,这部分内存分配是动态的。

GC的过程可以表述为:

1 识别可回收的垃圾对象

当程序中创建对象的时候,即new 关键字创建一个对象,GC就开始监控对象的地址、大小及使用状态。通常使用可达性分析算法找到那些否需要回收的对象,即不在被任何途径使用的对象,具体过程是:从“GC Roots”的对象(线程栈帧中的局部变量、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象 )开始标记,然后看被标记的对象是否引用了其他对象,继续向下标记,所有被标记的对象都是被应用使用的对象,没有被标记的对象也就是没有被任何对象引用,就是可以回收的垃圾对象了。

2 回收垃圾对象占用的内存

2.1 清理

将垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表中,当程序需要创建新对象的时候,从空闲列表中拿出一段空闲内存分配个新对象。

2. 2 压缩

从堆空间的head开始,将存货对象拷贝放在一段连续的内存中,剩下的空间就是连续的空闲空间。

2.3 复制

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

2.4 分代收集

把java堆分为新生代和老年代,根据各个年代的特点采用最合适的回收算法。所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速地回收掉那些生命周期短的对象。老年代中存放经历了多次垃圾回收后仍然存活的对象,这些对象的生命周期较长。新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。新生代使用的是复制算法,新生代里有 3 个分区:Eden、To、From,它们的默认占比是 8:1:1,执行流程如下:把 Eden + From 存活的对象放入 To 区;清空 Eden 和 From 分区;From 和 To 分区交换,From 变 To,To 变 From。每次在 From 到 To 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上步骤循环往复就构成了整个分代垃圾回收的整体执行流程。



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



三道阀门的设计

阀门:基于 TT 的计数器







秒杀器的预防

秒杀商品详情页面

  • URL: 随机

  • 秒杀前2秒放出,脚本生成,秒杀前。

  • 1000次访问上限控制【每件商品只能放入1000人流量】。

SetEnvIfNoCase Referer "^http://1688\.com/" local_ref=1
<FilesMatch "\.(htm|html)">
Order Allow, Deny
Allow from env=local_ref
</FilesMatch>

下单页面:

  • 订单ID,随机。

  • 不能直接跳过秒杀 商品详情页面 进入。

  • 每个秒杀商品,带预先生成的随机 Token 作 URL 参数。

  • 如果秒杀过,直接跳到秒杀结束页面。

  • 100 次访问上限控制 【每件商品只能放入 1000 人下单】。



XXX.com 秒杀系统:设计原则

静态化

  • 采用 JS 自动更新技术将动态页面转化为静态页面。(为运营人员开发,上传秒杀商品信息,转换为静态页面的运营系统。)



并发控制,防秒杀器

  • 设置阀门,只放最前面的一部分人进入秒杀系统。



简化流程

  • 砍掉不重用的分支流程,如下单页面的所有数据库查询。

  • 以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。



前端优化

  • 采用 YSLOW 原则提升页面的响应速度。



用户头像

a晖

关注

还未添加个人签名 2018.12.05 加入

还未添加个人简介

评论

发布
暂无评论
week9 作业