JVM 垃圾回收原理,秒杀系统架构方案
JVM垃圾回收原理
内存区域
程序计数器 (PC, Program Counter Register):当前线程执行方法JVM指令地址
Java虚拟机栈(Java Virtual Machine Stack):对应一次java方法调用保存一个Frame
堆 (Heap): 存放Java实例对象
方法区(Method Area):存放Meta数据,如类结构信息,运行时常量池,字段,方法代码等。
运行时常量池(Run-Time Constant Pool):是方法区一部分用于存放各种常量信息
本地方法栈(Native Method Stack):支持本地方法调用,与Java虚拟机栈一样每一个线程一个。
直接内存(Direct Memory):JDK1.4NIO引入基于Channel和Buffer的I/O方式,可以直接使用Native函数直接分配堆外内存。
Code Cache:通过JVM JIT编译后的热点方法,存放到这个空间。
垃圾回收
回收哪些内存
堆 (Heap)和方法区(Method Area)运行时才能确定创建对象的类型和个数存在不确定性, 垃圾回收器主要关注这两类内存。
程序计数器 (PC, Program Counter Register), Java虚拟机栈(Java Virtual Machine Stack), , 本地方法栈(Native Method Stack) : 这三个区线程创建时生成, 线程结束时内存释放, 除了即时编译触发的一些优化,这三个区在编译期间空间就已经是确定的了。 直接内存(Direct Memory),Code Cache ,
什么时候回收
可以通过以下两种方式进行判断.
引用计数: 为每个对象添加一个计数器,计数器为0时对象可回收。但如果遇到循环引用则无法判断。
可达性分析:GC Roots做为起始节点集,根据引用关系进行搜索, 搜索不到的认为可回收。
如何回收:
标记清除
“标记-清除”(Mark-Sweep)
标记复制
半区复制”(SemispaceCopying):将空间分为两块, 当一块用完了把存活的对象复制到另外一个区, 清理使用过的内存。
标记整理
将存活的对象向一段移动,清理边界外内存
分代处理
大多数对象都是短暂的, 这是此类数据的示例。 Y轴显示分配的字节数,而X访问显示随着时间的推移分配的字节数。随着时间的推移,分配的对象越来越少。 实际上,大多数对象的寿命很短,如图表左侧较高的值所示。
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
JVM Generations
新生代: eden,S0, S1
老年代: Tenured
永久代(根据jvm实现非标准):Permanent
回收过程
对象分配
填充Eden区, 触发a minor garbage collection
移动引用数据到S0, 清理非引用数据, 对象开始有了年龄计数
成长期,Eden和S0区的使用完后开始将引用数据移动到S1, 清理非引用数据,
成长期,Eden和S1区的使用完后开始将引用数据移动到S0, 清理非引用数据,
老年期,当对象年龄一直增大到达一定数值时就会移动到老年期, 避免内存复制造成的消耗,最终通过
a major GC清理掉老年期的非引用对象。
Eden和S0,S1之前的复制, 和上面 标记复制, 半区复制”(SemispaceCopying)处理思路一致。 将引用对象复制到其他区,清理本区的非引用对象。
使用空间较大的对象也会直接存入老年代。
并行处理:
串行回收器:
多个应用线程执行,当内存不足是JVM停止所有应用线程处理, 启动单线程进行内存空间释放和回收。单核时期无问题。
并行回收器:
增加垃圾回收线程数量,多核处理器支持下,性能有一定提升。
并发回收器CMS:
把垃圾回收过程分更加详细, 回收线程和应用线程并发执行, 减少Stop the World的执行。
G1回收器(并发回收)
原理同上,将原有的数据划分为更小的块,分而治之。
通过-XX:MaxGCPauseMillis可以设置GC栈顶时间。
秒杀系统架构方案
架构方案及原则:
系统部署
隔离:与现有应用系统隔离,单独分配服务器, 新增边缘节点,通过CDN分担压力。
单独部署
网络带宽提升
CDN租用
架构设计
精简: 用户请求数据和处理路径要简单避免复杂逻辑。
静态化
并发控制,防秒杀器
简化流程
前端优化
边缘化处理
处理方案
秒杀页面静态化: 静态页面提前生成定时下发, 而不是直接链接服务器
秒杀开始处理: 秒杀商品信息URL需要前端不断到后台获取,描述开始前数据未空。
三道阀门处理:通过秒杀,下单,支付层层限制达到削峰效果
系统优化:WebServer优化, 页面优化, 应用优化
PlanB以及应急预案:通过降级,限流, 拒绝服务等措施方式防止系统大流量下异常。
参考及引用
架构师训练营作业-李智慧老师相关讲义
https://www.alibabacloud.com/blog/how-does-garbage-collection-work-in-java_595387
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
评论