架构师训练营第九周作业
请简述 JVM 垃圾回收原理。
JVM垃圾回收就是JVM将堆内存上已经不再被使用的对象,回收释放内存资源的行为。
JVM通过可达性分析算法查找出堆内存上需要回收的对象,从线程栈帧的局部变量和方法区的静态变量开始,标记这些变量引用的对象,然后标记这些对象的引用对象,继续下去,标记完所有的引用对象,剩下没有标记的就是可以被回收的垃圾对象。
JVM的堆内存划分为新生代和老年代,新生代被划分为Eden区、From区和To区。JVM在分配对象首先使用Eden区,如果Eden区的内存使用完了,就会将Eden区还在使用的对象即存活对象拷贝到From区,Eden区就空出来继续分配内存,如果又使用完了,就将Eden区和From区的存活对象拷贝到To区,清理出Eden区,继续分配内存,Eden区的内存使用完了就将Eden区和另外两个区中其中一个有对象的里面所有的存活对象拷贝到另一个区中,在多次拷贝后,依旧存活的对象会被拷贝到老年代的内存中。当老年代中的空间满了后就会将新生代和老年代中的所有对象进行一次全量回收(FullGC)。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
挑战和问题主要出现在
1.网络带宽使用高乃至耗尽
2.服务器Load高,停止响应
3.数据库瘫痪
4.秒杀的安全性,禁止提前秒杀
思路是减少业务流程环节,并且把请求尽量拦截在上流,减少后段的服务器压力,特别是数据库资源。
架构方案是:
1.前端对商品详情页面进行静态化,通过CDN缓存和本地浏览器静态资源缓存,减少应用服务器连接数及带宽使用,并且通过在秒杀前提供的js文件防止用户提前拿到请求进行秒杀。
2.后端设置阀门,只允许最快提交的一部分请求通过,层层限流。去掉没有必要的数据库查询步骤,减轻数据库的压力。
评论