第九周 - 作业
1、请简述 JVM 垃圾回收原理。
JVM垃圾回收:是将JVM堆(包括方法区)中已经不再被使用的对象清理掉,释放出内存资源。
1、标记:
JVM通过可达性分析算法进行垃圾对象的识别,具体过程:从线程栈帧中的局部变量,或者方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些对象是否引用了其他对象,继续标记。最后没有被标记的对象就是垃圾对象了。
2、清理:
1. 清理:将垃圾对象占据的空间清理掉,标记为空闲。碎片化严重。
2. 压缩:将存活的对象拷贝到堆头的一段连续空间中,其余的就是空闲空间了。
3. 复制:将堆空间分为两部分,只在一个部分创建对象,当这个部分用完后,将存活 的对象拷贝到另一个部分中。
3、分代垃圾回收:
1. 新生代:
1) Eden区:
2) From区:
3) To区:
2. 老年代
4、JVM垃圾回收器算法:
1. 串行回收器:进垃圾回收的时候,停止所有用户线程STW,启动一个垃圾回收线程(单核心CPU),先标记,再回收垃圾。
2. 并行回收器:垃圾回收的时候,也是停止所有的用户线程STW,启动多个垃圾回收线程(多核心CPU),进行垃圾回收。
3. 并发回收器CMS:初始标记STW,时间很短,并发标记,和用户线程一起执行,重新标记STW,多线程执行,并发清理,和用户线程并发执行。
G1回收器:
2、设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
问题:
1. 突然有一个秒杀需求,并发访问量提高了100倍左右。
2. 时间紧,大概只有5天左右。
3. 网络带宽低,加载一张大图片导致系统崩溃。
解决:
1. 静态化:采用JS自动更新技术将动态页面转化为静态页面,利于反向代理服务器和CDN服务器的缓存。
1) 页面的静态化:将秒杀商品的list和detail做成静态的HTML页面,可以设计一个将动态页面转化为静态页面的工具系统。
2) 秒杀按钮的设计:将按钮的跳转url的商品的id放在一个js当中,当秒杀还没开始的时候,该js是空的,开始了,后台将该js上传,用户刷新就能获取到该js,就能点击秒杀按钮了。该js不缓存。
2. 设置阀门:只放最前面的一部分人进入秒杀系统。
点击秒杀的时候,基于TT的计数器,进行计数,大于1000的就不能给进入后面页面了。后面也可以继续使用计数器限制流量。
3. 简化流程:砍掉不必要的分支,如下单页面所有的数据库查询。下单成功,支付可以在1天内完成。
4. 采用YSLOW原则提升页面响应速度。
其它软件优化,appche、tomcat
评论