写点什么

【架构师训练营】第九周总结

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

数据库架构原理

数据库架构

连接器

数据库连接器会为每个连接请求分配一块专用的内存空间用于会话上下文管理。建立连接对数据库而言相对比较重,需要花费一定的时间,因此应用程序启动的时候,通常会初始化建立一些数据库连接放在连接池里,这样当处理外部请求执行SQL 操作的时候,就不需要花费时间建立连接了。

语法分析器

mysql> explain select * from users whee id = 1;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that

corresponds to your MySQL server version for the right syntax to use near 'id = 1' at line 1



select sgrade from staff where scity not in (select pcity from proj where sempname=p_pname)

语义分析与优化器

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

select f.id from orders f where f.user_id = (select id from users);

select f.id from orders f join users u on f.user_id = u.id;

执行计划



Key:索引类型,NULL无索引

Rows:需要处理的行数

Possible_keys:潜在可以利用的索引

为什么PrepareStatement更好

PrepareStatement 会预先提交带占位符的SQL 到数据库进行预处理,提前生成执行计划,当给定占位符参数,真正执行SQL 的时候,执行引擎可以直接执行,效率更好一点。



PrepareStatement 可以防止SQL 注入攻击。



  • select * from users where username = 'Frank’;

  • Frank';drop table users;--

  • select * from users where username = 'Frank';drop table users;--’;

  • select * from users where username = ?;



已经预处理好,后面的参数不会影响执行计划

JVM虚拟机架构原理

JVM组成架构

Java 是一种跨平台的语言,JVM 屏蔽了底层系统的不同,为Java 字节码文件构造了一个统一的运行环境。

每个线程有自己的栈,有自己的程序计数寄存器,记录执行到哪儿了,对象放在堆里。

方法区和堆共享

堆& 栈

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



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



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

方法区& 程序计数器

方法区主要存放从磁盘加载进来的类字节码,而在程序运行过程中创建的类实例则存放在堆里。程序运行的时候,实际上是以线程为单位运行的,当JVM 进入启动类的main方法的时候,就会为应用程序创建一个主线程,main 方法里的代码就会被这个主线程执行,每个线程有自己的Java 栈,栈里存放着方法运行期的局部变量。而当前线程执行到哪一行字节码指令,这个信息则被存放在程序计数寄存器。



方法区是一个特殊的堆

Java(线程)栈

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

线程工作内存& volatile

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



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

JVM垃圾回收

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



JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。



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



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

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

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

JAVA启动参数



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

  • 运行模式-server,-client

  • 类加载路径-cp,-classpath

  • 运行调试–verbose

  • 系统变量–D



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

  • -Xms 初始堆大小

  • -Xmx 最大堆大小

  • -Xmn 新生代大小

  • -Xss 线程堆栈大小

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

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



用户头像

知鱼君

关注

还未添加个人签名 2018.03.26 加入

还未添加个人简介

评论

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