写点什么

第 9 周总结 + 作业

用户头像
林毋梦
关注
发布于: 2020 年 08 月 05 日

总结



本周讲述了JVM的架构和秒杀案例。最让我记忆犹新的是秒杀案例开始的时候,老师卖关子发起的挑战。当年这个是一个巨大的挑战,看同学们有没有敢于接受挑战的勇气和思路。没有勇气与机会必然失之交臂,光有勇气,那是鲁莽,是自杀行为。



JVM



JVM架构



java虚拟机就像是一个操作系统,是对计算机的抽象,所以叫虚拟机。但是不同于其他虚拟化技术,这里更多是一个类比的名字,因为JVM主要是有内存管理和程序计数寄存器,理论上是完整的图灵机,又模拟了CPU的PC寄存器。



架构上看,JVM有三个部分组成:



  1. 类加载器

  2. 运行时数据区

  3. 执行引擎



Java语言是编译型语言。源文件要经过编译后生成字节码文件。因为JVM的指令有大约200条,可以用一个字节表示,所以称为字节码,相当于汇编指令。不同的是,字节码与平台无关,JVM提供字节码的运行环境,所以Java源文件一经编译为字节码,就可以在所有支持JVM的操作系统上运行,实现跨平台。



类加载器



类加载器负责加载字节码。JVM启动后,首先是用bootstrap类加载器加载rt.jar中的类,然后由平台类加载器载入随JRE发行的jar中的类,最后由应用类加载器载入CLASSPATH和其他源的类。



出于安全考虑,JRE采用双亲委派加载方式。就是说,当有类需要加载时,要沿着类加载器层级关系上溯到bootstrap,如果父级类加载已经加载,就直接使用已加载类,如果直到bootstrap都不曾加载,那么就向下委派到合适的类加载进行加载。这种方式有效的避免了核心类被恶意篡改的可能,因为核心类只能由JRE内置的两级类加载器从随JRE发行的JAR中载入。



运行时数据区



运行时数据区体现JRE的内存布局和管理,是java程序内存分配和GC算法运行的地方。



布局



从内存布局上看,运行期数据区有方法区,程序计数寄存器,堆,栈和本地方法栈。



方法区保存类的定义,静态数据和常量。



本地方法栈是为native方法调用分配的栈空间。



程序计数器寄存器保存的是下一条指令,是线程切换时需要的必要上下文。



堆是对象分配的区域。JRE把从操作系统获取的内存按大小块组织成堆,以便分配来保存对象。



栈是Java线程中方法调用的栈空间。栈顶永远是当前线程正在执行的方法,保存了方法的局部变量。



GC



GC是Java当年石破天惊的一大法宝,从最初的串行标记清除算法,已然发展到最新的G1垃圾回收算法。总体上讲,Java的垃圾回收算法是根据对象生命周期设计的标记清除算法。为了减少垃圾回收带来的停顿,JVM把堆做了分区。



  • 青年代,区域较小,对于绝大多数短周期对象,可以快速GC,避免出现停顿

  • 老年代,区域较大,是多次快速GC后任然存活的对象区域,需要时FGC,并compact内存,会导致STW



执行引擎



执行引擎在运行期解释或编译字节码。当指令运行时,执行引擎对指令计数,对多次执行的指令通过JIT编译成机器码加快执行效率。很多初次接触Java的人认为Java的字节码的执行效率因为解释执行方式天然低于机器码,对于一些benchmark表明Java有可能和C/C++处于同等水平,甚至有些场景下还能有所超出,完全难以想象。一个程序的整体性能并不是程序代码本身能完全体现的,还包括依赖和运行环境。在Java库使用更高级的数据结构,算法和编译优化的条件下,Java完全可能由于一些C/C++程序。



秒杀



秒杀案例讲述了一个5天上线一个秒杀系统的故事。



故事一开始,技术方就面临一个时间紧任务重的5天上线秒杀系统的中二需求。由于前期业务方对技术犯经验主义,错误的估算了工期和工程难度,但是前期的高额投入已是箭在弦上,不得不发。面对一个上万人年的业务系统,如何5天交付?



5天内改造旧系统是死路,构造新系统是唯一出路。于是思路是设计一个极简化的秒杀应用,轻装上阵,再根据系统的分层架构,逐层优化。



  • 机房



  • 服务器



  • 操作系统



  • 基础组件



  • 架构及设计



  • 应用代码



作业



JVM垃圾回收原理



基本原理是从栈对象和静态对象出发,标记可达对象,然后清除无引用对象。JVM在堆上划分青年代和老年代。在青年代上做快速回收。一来,青年代区域小,二来eden中的对象多是短生命周期,可以很快被回收,保证青年代的周转。回收时,把eden中可达的对象拷贝到Survivor1或2,清除无用对象。多次未回收对象就移入老年代,回收老年代需要FGC,即对整个堆运行GC算法,可能会带来较大停顿。



秒杀



基本思路就是限流和动静分离,必要时对非核心业务降级以支持交易系统。优化思路,详见上文秒杀部分。



发布于: 2020 年 08 月 05 日阅读数: 56
用户头像

林毋梦

关注

还未添加个人签名 2018.08.25 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
作业请添加”极客大学架构师训练营“标签,便于分类查找~
2020 年 08 月 05 日 14:09
回复
没有更多了
第9周总结+作业