写点什么

第九周作业

用户头像
Binary
关注
发布于: 2021 年 01 月 24 日
  • 请简述 JVM 垃圾回收原理。

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


JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部

变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被

标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对

象,而那些没有被标记的对象就是可回收的垃圾对象了。

进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法

  • 清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而

是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创

建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。

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

间就是连续的空闲空间。

  • 复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标

记过的可用对象复制到另一个空间中。


JVM 分代垃圾回收策略

  1. 对新生代垃圾回收

  2. 对老年代垃圾回收

程序中大部分对象都是在新生代的 Eden 区域中,当 GC 来临时,会遵循如下机制:

1.当 Eden 区域触发 GC 的时候,将 Eden 中还存活的对象复制到 S0 中,再清空 Eden 区。

2.然后当 S0 触发 GC 时候,将 S0 和 Eden 中还存活的对象复制到 S1 中,再清空 S0 和 Eden 区。

3.当 S1 也触发 GC 的时候,就将此区域内的从 S0 复制过来并且 GC 后还存活的对象复制到老年代,再清空 S1。

值得注意的是:GC 发生的时机是根据剩余内存的大小和具体的算法来决定的,不一定是当内存存满了才触发一次 GC。并且这里的 GC 指的是 Minor GC,也就是用一些快速回收算法实现的高效率 GC,这种方式只会对新生代进行回收。


JVM 分代垃圾回收两个过程

  1. Young GC,对新生代垃圾回收

  2. Full GC 全量的垃圾回收,对新生代,老年代垃圾一起回收


JVM 垃圾回收器算法

  1. 串行回收器

  2. 并行回收器

  3. 并发回收器 CMS

  4. G1 回收器


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

秒杀系统对系统的性能要求非常高,系统部署多少台服务器,能够提供最大的吞吐能力,应对最大的并发能力是架构师做架构选择的架构点。主要的挑战就是高并发。


核心的架构方案的设计原则

静态化

  • 采用 JS 自动更新技术将动态页面转化为静态页面

并发控制,防秒杀器

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

三道阀门的设计:基于 TT 的计数器


简化流程

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

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

  • 砍掉填写或选择收货地址,放在秒杀成功后填写。

  • 砍掉调用是否开通支付接口,秒杀首页文案提示必须开通。

  • 采用内存缓存, 秒杀 Offer 数据,支付相关信息,缓存


前端优化

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


应急预案


用户头像

Binary

关注

还未添加个人签名 2018.04.27 加入

还未添加个人简介

评论

发布
暂无评论
第九周作业