第 9 周作业
请简述JVM垃圾回收原理
垃圾回收主要需要解决的问题有:
1.如何知道哪些对象需要回收?
2.如何回收?
3.回收过程中的内存管理
4.回收的过程
哪些对象需要回收
JVM通过可达性算法,来识别对象是否需要被回收。如果一个对象被另一个对象应用,另一个对象被根引用,则对象为有用的对象。具体为,从根对象出发逐层标记引用的对象,以及对象引用的对象,找到所有被引用的对象,没有被标记的对象为垃圾对象。标记完后,将没有被标记的对象垃圾回收。
如何回收? 回收过程中的内存管理
回收的手段有三种:清理、压缩、复制
清理:把不连续的垃圾对象的空间记录。这种方法的问题是:可以空出很大空间,但是为碎片空间
压缩:把后面的对象,向前拷贝。剩下连续的可用空间
复制:空间分为两块,将可用的连续对象,拷贝到另一块空间中。
内存的分代回收
为了提高效率,JVM把对象放置到不同的空间。
刚创建出来的对象,只有少部分被长期引用,大部分对象,生存空间短。
分配新生代空间,创建出来的对象先放到新生代,当新生代满了,扫描新生代,进行回收。使用较少的空间,扫描较少的对象,进行回收。长期使用的对象,移动到老年代。
具体回收过程如下:
创建对象,放入Eden区,当Eden区满了,启动Eden区的垃圾回收。
将有应用的对象放到From区,Eden区清空。
如果Eden区再次满,扫描,将Eden区和From有应用的对象,放入到to区。
下次再满了,对于Eden区和To区有引用的对象,拷贝到From区。
多次拷贝,如果一直在From或to区的对象,拷贝到老年代。
如果空间再满了,进行一次全量的回收,即Full GC。
JVM垃圾回收算法
分为四种算法:串性回收、并行回收、回收并发器、G1回收器
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方向或思路有哪些?
秒杀系统的压力在于并发请求。
对秒杀时的峰值并发进行预估,系统设计需要可以抗住峰值流量。
可能的问题及解决思路:
优化当前系统开发量巨大
系统重构工作量巨大,最好的方法是建立一个新的系统。既方便资源的调配,也不会对现有系统造成影响。
带宽压力、数据库压力
页面需要动静分离。对于访问商品的列表的页面以及商品详情的页面,由于秒杀的商品是固定的,可以给开通商品配置通道,将数据写到缓存。用户访问直接访问缓存,而不是数据库。从而减轻数据库压力。
对于图片等,占用带宽的资源,建立图片服务器。
对于传输的数据,也可以进行压缩,减少数据量。
防止用户找到提交页面
在秒杀开始之前,要需要页面中不可用有订单提交的页面。否则,可能用户直接访问,秒杀未开始先下单买到了商品。
建立valid-offer.js,用户刷新浏览器访问时,其他内容从浏览器缓存中获取,只有这个问题是从服务器实时获取。在秒杀开始的时间,通过这个文件,做提交页面展示的开关。
流量限制
可以使用TT计数器等。只放入秒杀开始后的,前n个请求,为用户现实排队中,进行后续的处理,其他请求可以直接给用户返回秒杀结束。
为了增加秒杀功能性(或用户感知更公平),可以在在进入秒杀、进入下单、进入支付三个页面,逐步通过计数器进行限流。
应急预案
和原有业务尽可能分离,防止影响;准备有备用服务器,看那个服务压力大了,及时扩容;如果服务扛不住要跳转到万能页面等等。
版权声明: 本文为 InfoQ 作者【破晓_dawn】的原创文章。
原文链接:【http://xie.infoq.cn/article/c265f3fde4a8bec04485f6ca1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论 (1 条评论)