写点什么

架构师训练营 week9 学习总结

用户头像
花果山
关注
发布于: 2020 年 12 月 20 日
  • 数据库基本原理

PrepareStatement 预编译

B+树

聚簇索引

非聚簇索引

数据库事务 ACID

数据库事务日志

  • JVM 虚拟机原理

    

字节码

类加载器的双亲委托模型

自定义类加载器

隔离加载类:同一个 JVM 中不同组件加载同一个类的不同版本。

扩展加载源:从网络、数据库等处加载字节码。

字节码加密:加载自定义的加密字节码,在 ClassLoader 中解密。

堆 & 栈

堆:每个 JVM 实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享。

堆栈:JVM 为每个新创建的线程都分配一个堆栈。也就是说,对于一个 Java 程序来说,它的运行就是通过对堆栈的操作来完成的。

Java 中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对

象,而在堆栈中分配的内存只是一个指向这个堆对象的引用而已。

方法区 & 程序计数器

方法区主要存放从磁盘加载进来的类字节码,而在程序运行过程中创建的类实例则存放在堆里。程序运行的时候,实际上是以线程为单位运行的,当 JVM 进入启动类的 main

方法的时候,就会为应用程序创建一个主线程,main 方法里的代码就会被这个主线程执行,每个线程有自己的 Java 栈,栈里存放着方法运行期的局部变量。而当前线程执行

到哪一行字节码指令,这个信息则被存放在程序计数寄存器。

Java(线程)栈

所有在方法内定义的基本类型变量,都会被每个运行这个方法的线程放入自己的栈中,线程的栈彼此隔离,所以这些变量一定是线程安全的。

线程工作内存 & volatile

Java 内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。

一个共享变量(类的成员变量、类的静态成员变量)被 volatile 修饰之后,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他

线程来说是立即可见的。

  • JVM 垃圾回收性能分析

JVM 垃圾回收就是将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。

JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被

标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。

进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法

• 清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。

• 压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空间就是连续的空闲空间。

• 复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。

JVM 分代垃圾回收

JVM 垃圾回收器算法

G1 垃圾回收内存管理机制

Java 启动参数

标准参数,所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容

• 运行模式 -server,-client

• 类加载路径 -cp,-classpath

• 运行调试 –verbose

• 系统变量 –D

非标准参数, 默认 jvm 实现这些参数,但不保证所有 JVM 实现都实现,且不保证向后兼容

• -Xms 初始堆大小

• -Xmx 最大堆大小

• -Xmn 新生代大小

• -Xss 线程堆栈大小

非 Stable 参数, 此类参数各个 jvm 实现会有所不同,将来可能会随时取消

• -XX:-UseConcMarkSweepGC 启用 CMS 垃圾回收

JVM 性能诊断工具

基本工具:JPS ,JSTAT,JMAP,JSTACK

集成工具: JConsole,JVisualVM

  • Java 代码优化技巧及原理

启动线程数 = [任务执行时间 / (任务执行时间 - IO 等待时间)] * CPU 内核数

• 最佳启动线程数和 CPU 内核数量成正比,和 IO 阻塞时间成反比。如果任务都是 CPU 计算型任务,那么线程数最多不超过 CPU 内核数,因为启动再多线程,CPU 也来不及调 度;相

反如果是任务需要等待磁盘操作,网络响应,那么多启动线程有助于提高任务并 发度,提高系统吞吐能力,改善系统性能。

竞态条件与临界区

在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。

在临界区中使用适当的同步就可以避免竞态条件。

Java 线程安全

允许被多个线程安全执行的代码称作线程安全的代码。

方法局部变量

• 局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。

方法局部的对象引用

• 如果在某个方法中创建的对象不会逃逸出该方法,那么它就是线程安全的。

对象成员变量

• 对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的。

ThreadLocal

Java 内存泄漏

合理使用线程池和对象池

使用合适的 JDK 容器类(顺序表,链表,Hash)

缩短对象生命周期,加速垃圾回收

使用 I/O buffer 及 NIO

优先使用组合代替继承

合理使用单例模式

计算机的任何问题都可以通过虚拟层(或者中间层)解决

  • 秒杀系统

XXXX.com 秒杀系统:设计原则

静态化

• 采用 JS 自动更新技术将动态页面转化为静态页面并发控制,防秒杀器

• 设置阀门,只放最前面的一部分人进入秒杀系统

简化流程

• 砍掉不重要的分支流程,如下单页面的所有数据库查询

• 以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。

前端优化

• 采用 YSLOW 原则提升页面响应速度

Web Server 调优


发布于: 2020 年 12 月 20 日阅读数: 18
用户头像

花果山

关注

还未添加个人签名 2019.05.09 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 week9 学习总结