架构师训练营——week09
简述 JVM 垃圾回收原理。
垃圾回收是指 JVM 自动回收分配给自己的内存空间。可以从三个方面来了解垃圾回收。
1、JVM 为什么需要垃圾回收?
计算机资源的是宝贵的,特别是内存空间,而程序在运行过程会在内存中不断创建对象;如果不进行回收,也就是内存泄漏,JVM 很快会耗尽分配给其的内存空间,从而导致程序奔溃。在 Java 语言中不需要开发者像 C/C++
一样进行内存分配管理,而是交由 JVM 的垃圾收集器来管理,因此垃圾收集器的主要工作就是内存管理。
2、JVM 什么时候进行垃圾回收?
通常来说,JVM 会根据程序运行情况,遇到分配的内存空间不足的时候才会触发 Minor GC
或者 Full GC
,具体跟不同的 GC Collector 也有关系。
在整个 JVM 内存空间,通常可以划分为堆、Java 线程栈、元数据区、程序计数器、直接内存(NIO)、JNI 线程栈。其中堆主要用来存放对象,是 GC 的主要区域;而元数据区理论上也是可以进行 GC,但这部分主要存储类型信息如 class 文件、常量、静态变量等,故这块内存区域回收的条件较为苛刻。而其他区域一般很少会进行垃圾回收。
3、JVM 如何进行垃圾回收?
由于 GC 的主要内存区域是堆,此处主要讨论堆内存回收。在 JVM 启动的过程可以通过参数 -Xms
和 -Xmx
分别设置堆的最小和最大内存。
垃圾回收是通过 JVM 的垃圾收集器来执行的,目前常用的垃圾收集器 有 parallelGC(并行 GC)、CMSGC(并发 GC)、G1GC、ZGC 以及 ShenandoahGC。
根据 JAVA 对象特征——朝生夕死,便于快速回收垃圾对象,减少 STW 时间,将堆的内存划分为年轻代和老年代,而年轻代又划分为 eden、from、to 区来进行 GC。垃圾收集器在工作的时候会针对年轻代进行 YongGC
,而老年代会进行 Full GC
。随着计算机硬件的发展,内存区域越来越大(上 T 的内存),如果仍按照上述的区域划分进行垃圾回收,那么很有可能 STW 的时间久到超过应用容忍。故在 G1GC 之后 JVM 堆内存引入 reigion 的概念,将整个内存区域分为 2048 个 region,然后垃圾回收的也是以 region 为单位。同时 JVM 支持并发的进行垃圾回收,也就是说应用执行的过程中,会有 VM GCThread 进行垃圾回收工作。减少 STW 时间和应用的延迟性,当然这同时也会降低整体 JVM 的吞吐量。
设计秒杀系统的主要挑战和问题有哪些?核心的架构方案或者思路是哪些?
秒杀是指有限的商品以一个集体的价格在一个确定的时间售卖。
1、主要挑战和问题有哪些?
瞬间高并发
秒杀的时候会有大流量冲进系统,此时秒杀商品有大量图片,如果较好的机制很有可能会导致服务器带宽耗尽从而给用户一种服务 down 掉的错觉;另外大流量意味着服务器需要大量的线程响应,那么极有可能会导致服务器的资源耗尽从而导致服务崩溃。
秒杀器
其一,秒杀前用户不断刷新秒杀页面直到秒杀开始;其二,用户基于自动化工具或者脚本,跳过秒杀页面直接进入下单页面下单。
2、秒杀系统的核心架构方案?
基于系统的稳定性、秒杀活动的通用性和常态化,可以设计一套秒杀活动系统,其主要有秒杀商品列表、秒杀商品详情、下单支付三个页面组成。主要设计原则如下:
静态化
并发控制(基于计数器防止秒杀器)
简化流程
前端优化
版权声明: 本文为 InfoQ 作者【睁眼看世界】的原创文章。
原文链接:【http://xie.infoq.cn/article/75c5a720bb08937273ff54345】。文章转载请联系作者。
评论