写点什么

第九周命题作业

用户头像
菲尼克斯
关注
发布于: 2020 年 08 月 05 日

请简述 JVM 垃圾回收原理



垃圾回收就是回收不再被引用的对象的内存空间。

1、判断需要回收的对象。有2种方法,引用计数法和可达性分析法。

引用计数法,在对象内部会有一个计数器,一旦某个地方引用它,计数器就加1;不再引用,计数器就减1;计数器为0时,认为可以回收;存在的问题是,如果两个对象互相引用,计数器则不会为0,则引用计数法无法回收它们。

可达性分析法,通过GC ROOT的对象作为搜索起始点,通过引用向下搜索,路径称为引用链,类似于树状结构,当一个对象到GC ROOT没有任何引用链,即不可达,则证明此对象可回收。

2、回收对象。有四种回收算法。标记-清除算法、复制算法、标记-整理算法、分代收集算法。

标记-清除算法,先把内存区域中可回收的对象进行标记,然后再对这些垃圾进行清理,存在的问题是,造成大量的内存碎片。

复制算法,将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间清理掉。存在的问题是,每次只使用一半的内存空间,也就是牺牲了一半的存储空间。

标记-整理算法,先把内存区域中可回收的对象进行标记,然后让所有存活的对象都向一端移动,最后清理掉端边界以外的内存区域。

分代收集算法,是融合上述3种基础算法的组合。将内存划分为新生代、老年代、永久代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,选用复制算法。在老年代中,因为对象存活率高、没有额外空间对它进行分配,使用标记-清理算法或者标记-整理算法来进行回收。



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

主要的挑战和问题:高并发导致的网络带宽耗尽、服务器Load飙高,停止响应、数据库瘫痪;恶意请求;超卖。

思路:

1、页面优化。页面完整缓存到redis中;前后端分离;利用浏览器缓存;使用压缩后的js、css;使用CDN;

2、接口优化。商品数量预加载到redis中;库存充足的情况下,从redis中扣减库存数量后,进入消息队列排队;出队,生成订单,数据库扣减库存,sql带数量判断(>0);轮询获得秒杀结果(是否生成订单);

3、限流。使用图形验证码;限制单用户访问次数;

4、服务器优化。修改tomcat连接数;nginx配置压缩、缓存;操作系统优化(进程、线程);

5、集群。数据库读写分离;应用多节点,负载均衡;



用户头像

菲尼克斯

关注

还未添加个人签名 2018.05.14 加入

还未添加个人简介

评论

发布
暂无评论
第九周命题作业