作业 --week09
请简述 JVM 垃圾回收原理。
解析:
1.(Where)JVM回收哪里的垃圾:
JVM组成架构:类加载器,运行时数据区,执行引擎。
类加载器:负责加载.class字节码文件。
运行期数据区:.class字节码被类加载器加载到运行时数据区,放置到线程共享区的方法区作为缓存。
执行引擎:将字节码的操作执指令转换为操作系统的本地指令,交给CPU执行。
运行期数据区:线程共享区:方法区和堆;线程私有区:Java栈和程序计数器。
JVM垃圾回收,主要针对堆回收垃圾。
2.(HOW)如何回收
标记,清理,压缩,复制。
标记:可达性分析算法标记可达对象。从线程栈的局部变量表,或者静态变量出发,标记所有可达对象,未被标记的对象,视为不可达对象,即标记为垃圾。
清理:回收垃圾,可采用清理算法。清理算法优点:灵活有效分配内存,缺点:多次垃圾回收后,内存碎片增多,不利于大对象分配。
压缩:回收垃圾后,存活的对象,向一端压缩,剩余部分为连续大块内存。优点:减少内存碎片,有利于大对象分配;缺点:回收大块内存空间,耗费时间长。
复制:大块内存分成两个部分AB,A块内存分配满后,回收垃圾,存活下来的对象,复制到B内存块。A块内存被清理干净。B块分配满回收垃圾,存活对象被复制到A。
如图示:
3.分代:
原因1:内存块小,回收垃圾效率高。
原因2:局部变量随着栈帧出栈而消亡,生命周期比较短。大量的对象都属于这种类型。
内存空间分代:新生代和老年代。新生代分为:Eden伊甸园区,From和To区
图示:
4.算法
垃圾回收算法:串行垃圾回收算法,并行垃圾回收算法,并发垃圾回收算法,G1垃圾回收算法。
G1回收器特点:分成更多的小块区域,针对小块内存区回收垃圾,效率更高,占用的资源更少。对用户程序的影响更小。可管理的内存空间更大。
当前比较主流的垃圾回收器。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
解析: 主要挑战:1.瞬间高并发; 2.用户跳过秒杀页面,直接下单;
主要问题:1.瞬间高并发导致服务器崩溃:
瞬间高并发读:商品列表缩略图商品详情大图等产生大量流量,带宽可能被耗尽。
瞬间高并发写:瞬间高并发写入数据库,导致数据库崩溃。
2.用户跳过秒杀页面,直接下单,会导致商品在秒杀前被卖出。
核心架构方案:
0.系统隔离:如果使用现有系统承担秒杀业务,那么现有系统需要承担瞬间高并发量可能是原来的成百上千倍, 直接扩容,则成本昂贵,实际上不可行。所以不在原有系统上做秒杀业务,可新开发秒杀系统,单独承担秒杀业务。与原有系统隔离。即使秒杀系统考虑不周,出现异常,不影响原有系统。
1.瞬间高并发读架构方案:静态化
静态化目的:减少页面动态生成,即减少对数据库高并发读,减轻数据库压力
静态化列表和详情:静态化秒杀商品列表页面和秒杀商品详情页面。可单独开发静态化系统,
静态化控制下单:目的:阻止用户跳过秒杀页面直接下单。
方法:秒杀的商品和下单的URL,在秒杀前几分钟放出。可将秒杀商品的ID在秒杀前几分钟写入指定JS,商品详情页面轮询检查JS,核定当前商品ID在JS中,则点亮购买按钮,允许用户下单,同时给出下单的地址。
2.瞬间高并发写架构方案:三道阀门设计
目的:并发控制。秒杀业务决定只有少部分用户可以秒杀成功,大部分用户秒杀失败。
措施:用户如果秒杀失败,就可以阻止用户进入秒杀后面的业务流程,直接告诉用户秒杀失败。
这样可以阻挡拦截大部分并发请求,大大降低服务器负载压力。
方法:三道阀门设计,假设秒杀商品56件。
阀门1:限制进入1000并发请求;
阀门2:限制进入100并发请求;
阀门3:限制进入56个并发请求
图示:
评论