写点什么

JVM 垃圾回收原理,秒杀系统架构方案

用户头像
garlic
关注
发布于: 2020 年 11 月 22 日
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



回收过程



  1. 对象分配



  1. 填充Eden区, 触发a minor garbage collection 





  1. 移动引用数据到S0, 清理非引用数据, 对象开始有了年龄计数





  1. 成长期,Eden和S0区的使用完后开始将引用数据移动到S1, 清理非引用数据,





  1. 成长期,Eden和S1区的使用完后开始将引用数据移动到S0, 清理非引用数据,





  1. 老年期,当对象年龄一直增大到达一定数值时就会移动到老年期, 避免内存复制造成的消耗,最终通过

a major GC清理掉老年期的非引用对象。





Eden和S0,S1之前的复制, 和上面 标记复制, 半区复制”(SemispaceCopying)处理思路一致。 将引用对象复制到其他区,清理本区的非引用对象。

  使用空间较大的对象也会直接存入老年代。



并行处理:



  • 串行回收器:



多个应用线程执行,当内存不足是JVM停止所有应用线程处理, 启动单线程进行内存空间释放和回收。单核时期无问题。



  • 并行回收器:

增加垃圾回收线程数量,多核处理器支持下,性能有一定提升。





  • 并发回收器CMS:

把垃圾回收过程分更加详细, 回收线程和应用线程并发执行, 减少Stop the World的执行。





  • G1回收器(并发回收)

原理同上,将原有的数据划分为更小的块,分而治之。





通过-XX:MaxGCPauseMillis可以设置GC栈顶时间。



秒杀系统架构方案



架构方案及原则:



  1. 系统部署

隔离:与现有应用系统隔离,单独分配服务器, 新增边缘节点,通过CDN分担压力。

  • 单独部署

  • 网络带宽提升

  • CDN租用



  1. 架构设计

精简: 用户请求数据和处理路径要简单避免复杂逻辑。

  • 静态化

  • 并发控制,防秒杀器

  • 简化流程

  • 前端优化

  • 边缘化处理



  1. 处理方案

  • 秒杀页面静态化: 静态页面提前生成定时下发, 而不是直接链接服务器

  • 秒杀开始处理: 秒杀商品信息URL需要前端不断到后台获取,描述开始前数据未空。

  • 三道阀门处理:通过秒杀,下单,支付层层限制达到削峰效果

  • 系统优化:WebServer优化, 页面优化, 应用优化

  • PlanB以及应急预案:通过降级,限流, 拒绝服务等措施方式防止系统大流量下异常。



参考及引用



架构师训练营作业-李智慧老师相关讲义

Photo by Valery from Pexels

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



用户头像

garlic

关注

还未添加个人签名 2017.11.15 加入

还未添加个人简介

评论

发布
暂无评论
JVM垃圾回收原理,秒杀系统架构方案