写点什么

架构师训练营第九周总结

用户头像
月殇
关注
发布于: 2020 年 11 月 22 日

数据库架构原理

PrepareStatement 预编译

防止 SQL 注入攻击

数据库架构

SQL 请求->连接器->语法分析器->语义分析和优化器->执行引擎

连接器

数据库连接器会为每个连接请求分配一块专用的内存空间用于会话上下文管理。

语法分析器

对 SQL 语法进行分析

语义分析与优化器

语义分析与优化器就是要将各种复杂嵌套的 SQL 进行语义等价转化,得到有限几种关系代数计算结构,并利用索引等信息进一步进行优化。


聚簇索引

聚簇索引的数据库记录和索引存储在一起

非聚簇索引

非聚簇索引在叶子节点记录的就不是数据行记录,而是聚簇索引,也就是主键。

通过非聚簇索引找到主键索引,再通过主键索引找到行记录的过程也被称作回表。

合理使用索引

不要盲目添加索引,尤其在生产环境中

删除不用的索引,避免不必要的增删开销

使用更小的数据类型创建索引

数据库事务

原子性、隔离性、持久性、一致性

数据库事务日志

进行事务操作时,事务日志文件会记录更新前的数据记录,然后再更新数据库中的记录,如果全部记录都更新成功,那么事务正常结束,如果过程中某条记录更新失败,那么整个事务全部回滚,已经更新的记录根据事务日志中记录的数据进行恢复,这样全部数据都恢复到事务提交前的状态,仍然保持数据一致性。


JVM 虚拟机原理

计算机领域的任何问题都可以通过增加个中间层(虚拟层)来解决

类加载器的双亲委托模型

低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类。如果低层次的类加载器想加载一个未知类,需要上级类加载器确认,只有当上级类加载器没有加载过这个类,也允许加载的时候,才让当前类加载器加载这个未知类。

自定义类加载器

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

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

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

堆 & 栈

堆:每个 JVM 实例唯一对应一个堆。

堆栈:JVM 为每个新创建的线程都分配一个堆栈。

方法区 & 程序计数器

方法区主要存放从磁盘加载进来的类字节码,而在程序运行过程中创建的类实例则存放在堆里。

程序计数器则是记录线程执行到哪一行字节码指令

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

JPS

JPS 用来查看 host 上运行的所有 Java 进程的 pid(jvmid),一般情况下使用这个工具的目的只是为了找出运行的 JVM 进程 ID

JSTAT

主要对 Java 应用程序的资源和性能进行实时的命令行的监控,包括了对 Heap size 和垃圾回收状况的监控。

JMAP

JMAP 是一个可以输出所有内存中对象的工具,甚至可以将 VM 中的 heap,以二进制输出成文本。

jstack

jstack 可以查看 JVM 内的线程堆栈信息


Java 代码优化

合理并谨慎使用多线程

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

竞态条件与临界区

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

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

Java 线程安全

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

方法局部变量

方法局部的对象引用(逃逸分析)

对象成员变量

Java 内存泄漏

Java 内存泄漏是由于开发人员的错误引起的。

如果程序保留对永远不再使用的对象的引用,这些对象将会占用并耗尽内存。

长生命周期对象

静态容器

缓存

合理使用线程池和对象池

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

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

创建对象的步骤(静态代码段-静态成员变量-父类构造函数-子类构造函数)

使用 I/O buffer 及 NIO

延迟写与提前读策略

异步无阻塞 IO 通信

优先使用组合代替继承

合理使用单例模式

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


发布于: 2020 年 11 月 22 日阅读数: 29
用户头像

月殇

关注

还未添加个人签名 2019.04.15 加入

还未添加个人简介

评论

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