架构师训练营第九周总结

用户头像
坂田吴奇隆
关注
发布于: 2020 年 08 月 02 日



Java 内存区域



线程私有的:

  • 程序计数器

  • 虚拟机栈

  • 本地方法栈

线程共享的:

  • 方法区

  • 直接内存 (非运行时数据区的一部分)



Java 垃圾回收



常见的垃圾回收算法:



  • 标记清除算法

该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。

存在的问题:可能产生大量的内存碎片。

  • 复制算法

将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收

  • 标记整理算法

根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法

根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。



常见的垃圾收集器:



  1. serial收集器,新生代采用复制算法,老年代采用标记-整理算法。 

  2. ParNew收集器,新生代采用复制算法,老年代采用标记-整理算法,多线程版serial收集器。

  3. Parallel Scavenge 收集器,新生代采用复制算法,老年代采用标记-整理算法,关注吞吐量。

  4. cms收集器,以获取最短回收停顿时间为目标的收集器,优点是发收集、低停顿。缺点是对 CPU 资源敏感;无法处理浮动垃圾;它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

  5. G1收集器,是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征.



JDK 命令行工具



  • jps (JVM Process Status): 类似 UNIX 的 ps 命令。用户查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;

  • jstat( JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;

  • jinfo (Configuration Info for Java) : Configuration Info forJava,显示虚拟机配置信息;

  • jmap (Memory Map for Java) :生成堆转储快照;

  • jhat (JVM Heap Dump Browser ) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果;

  • jstack (Stack Trace for Java):生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。



类加载器



JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader



  1. BootstrapClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载 %JAVA_HOME%/lib目录下的jar包和类或者或被 -Xbootclasspath参数指定的路径中的所有类。

  2. ExtensionClassLoader(扩展类加载器) :主要负责加载目录 %JRE_HOME%/lib/ext 目录下的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。

  3. AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类。

双亲委派模型



每一个类都有一个对应它的类加载器。系统中的 ClassLoder 在协同工作的时候会默认使用 双亲委派模型 。即在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。加载的时候,首先会把该请求委派该父类加载器的 loadClass() 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。当父类加载器为null时,会使用启动类加载器 BootstrapClassLoader 作为父类加载器。





秒杀系统:



  • 技术挑战

  1. 对现有网站业务的冲击

  2. 高并发下的应用,数据库负载

  3. 突然增加的网络及服务器带宽。

  4. 防止直接下单



  • 应对策略

  1. 秒杀系统独立部署

  2. 秒杀商品页面静态化

  3. 租借秒杀活动网络带宽

  4. 动态生成随机下单页面URL



用户头像

坂田吴奇隆

关注

还未添加个人签名 2019.01.06 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周总结