第九章作业
请简述 JVM 垃圾回收原理
对年轻代中的对象进行回收被称为 Minor GC, 对年老代的对象的回收则称为 Major GC, 一个年轻对象经历过了一定次数的 Minor GC,JVM 一般就会将这个对象放入到年老代。
大部分对象刚创建的时候,JVM 会将其分布到 Eden 区域。当 Eden 区域中的对象达到一定的数目的时候,就会进行 Minor GC,经历这次垃圾回收后所有存活的对象都会进入两个 Suvivor Place 中的一个。同一时刻两个 Suvivor Place,即 s0 和 s1 中总有一个总是空的。年轻代中的对象经历过了多次的垃圾回收就会转移到年老代中。
当申请不到空间时会抛出 OutOfMemoryError。
GC 算法:
标记-清除(Mark-Sweep)算法:最基础的垃圾收集算法是“标记-清除”(Mark Sweep)算法,算法分为 2 个阶段:1.标记处需要回收的对象,2.回收被标记的对象。标记算法分为两种:1.引用计数算法(Reference Counting) 2.可达性分析算法(Reachability Analysis)。由于引用技术算法无法解决循环引用的问题,所以这里使用的标记算法均为可达性分析算法。(可达性分析算法?GC Root 到各个对象,如果 GC Root 到某个对象还有可达的引用链,那么这个对象就还不能被回收;GCRoot 的对象有哪些?虚拟机栈中的引用对象、方法区中类静态属性引用的对象、方法区中常量引用对象、本地方法栈中 JNI 引用对象)
标记-复制(Mark-Copy)算法:为了解决效率与内存碎片问题,复制(Copying)算法出现了,它将内存划分为两块相等的大小,每次使用一块,当这一块用完了,就将还存活的对象复制到另外一块内存区域中,然后将当前内存空间一次性清理掉。这样的对整个半区进行回收,分配时按照顺序从内存顶端依次分配,这种实现简单,运行高效。不过这种算法将原有的内存空间减少为实际的一半,代价比较高。Eden:S0:S1=8:1:1
标记-整理(Mark-Compact)算法: 首先是标记对象,然而第二步是将存货的对象向内存一段移动,整理出一块较大的连续内存空间。
标记-复制算法一般用于新生代的 MinorGC(YoungGC),标记-整理算法一般用于老年代的 MajorGC(FullGC)。
分代收集算法
分代收集算法理论来源于统计学。IBM 公司的专门研究发现,对象的生存周期总体可分为三种:新生代、老年代和永久代。因此可以根据各个年代的特点采用适当的垃圾回收算法。比如新生代的对象在每次垃圾时都会有大量的对象死去,只有很少一部分存活,那就可以选择标记-复制算法。另外,在新生代中每次死亡对象约占 98%,那么在标记-复制算法中就不需要按照 1:1 的比例来划分内存区域,而是将新生代细分为了一块较大的 Eden 和两块较小的 Survivor 区域,HotSpot 中默认这两块区域的大小比例为 8:2。每次新生代可用区域为 Eden 加上其中一块 Survivor 区域,共 90%的内存空间,这样就只有 10%的内存空间处在被闲置状态。在进行垃圾回收时,存活的对象被转移到原本处在“空闲的”Eden 区域。如果某次垃圾回收后,存活对象所占空间远大于这 10%的内存空间时,也就是 Survivor 空间不够用时,需要额外的空间来担保,通常是将这些对象转移到老年代。对于老年代来说,大部分对象都处在存活状态。同时,如果一个大对象要在该区域进行分配,而内存空间又不足,那么在没有外部内存空间担保的情况下,就必须选用标记-清除或者标记-整理算法来进行垃圾回收了。
Minor GC ,Full GC 触发条件
Minor GC 触发条件:当 Eden 区满时,触发 Minor GC。
Full GC 触发条件:
(1)调用 System.gc 时,系统建议执行 Full GC,但是不必然执行
(2)老年代空间不足
(3)方法区空间不足
(4)通过 Minor GC 后进入老年代的平均大小大于老年代的可用内存
(5)由 Eden 区、From Space 区向 To Space 区复制时,对象大小大于 To Space 可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
主要挑战:
要支撑柱大流量、高并发,并且不会影响原有系统的正常运行。
主要思路:
1.秒杀系统需要独立设计和部署避免影响原有系统的正常运行
2.前端优化:将动态页面静态化(通过脚本推送至 CDN),图片压缩(雪碧图)、CSS、JS 压缩、
避免发送 Cookies
3.并发控制:三个环节:进入秒杀页面→填写订单→提交订单,通过阀门将每一个环节只放一部分请求进入秒杀系统
4.流程简化。砍掉不需要的分支流程,尽量减少数据库的直接访问
5.秒杀器预防:详情页的 URL 随机生成,确保用户不能提前进入详情页
6.系统优化:反向代理参数优化、JVM 参数优化、中间件和基础组件采用性能更高的版本
评论