作者:赖-哥_528 | 来源:互联网 | 2023-10-11 08:05
一、jvm相关
1、java执行流程以及五个运行时区
程序计数器:当前线程所执行的字节码的行号指示器,为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器,互不影响,独立存储,我们称之为“线程私有”,他也是java虚拟机规范中没有规定任何oom情况的区域
虚拟机栈:线程私有,生命周期和线程相同,它是描述java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接等信息,每个方法从调用到执行完成的过程,就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程
本地方法栈:与虚拟机栈是十分相似的,区别就是虚拟机栈执行的是java方法,本地方法栈则是为native方法服务,虚拟机栈和本地方法栈都可能抛出***Error和OutOfMemoryError异常。
堆:内存共享的区域,所有的对象实例和数组都要在堆上分配,几乎所有的对象都在这里分配,但随着JIP编译器的发展,技术逐渐成熟,栈上分配、标量替换优化技术会导致一些微妙的变化发生,这让所有的对象都在堆上分配变的不那么“绝对”了。
方法区:线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量等信息,虽然java虚拟机规范把方法去描述为堆的一个逻辑部分,但他还有一个别名Non-heap(非堆)目的就是和java堆分开。
二、树相关
二叉树、完全二叉树、平衡二叉树、b树、b+树
引言:二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。
所以,我们为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。
1、二叉树,每个节点最多有两个子树,左右子树是有顺序的,极端情况下顺序插入的元素可能是链表形式
2、完全二叉树,首先它也是二叉树,简单描述就是除了最后一层外,其余各层节点数都达到最大,最后一层的节点都连续集中在左边。
3、平衡二叉树,它的左右两个子树的高度差的绝对值不超过1,(空树也是平衡二叉树,它只有一个根节点,左右子树都为0,0-0<1成立)
4、b树,全称Balance-tree(平衡多路查找树),平衡的意思是左右两边分布平衡,多路的意思是它不像二叉树,最多两个子节点,二路查找树,b树可以有多个节点。描述一颗 B树时需要指定它的阶数,阶数表示此树的结点最多有多少个孩子结点(子树),一般用字母 M 表示阶数。(即遍观整棵树,子节点最多的个数是m,那么这棵树就是m阶树),所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;
b树中的每个节点保存的都是data数据,b+树只有叶子节点才存储数据data,非叶子节点只存储索引信息。
用上图为例,查询数值为5:第一次磁盘IO,在内存中比较 (与17,35比较)比17小,左子树,第二次磁盘IO
,在内存中定位(与8、12比较),比8小,左子树,第三次磁盘IO,在内存中定位(与3,5比较),找到5终止
5、b+树,是b树的变种,B+树只在叶子节点存储data,B+降低了树的深度,将“瘦高”的树变得“矮胖,有着比b树更高的查询效率,原因如下:
1. B+树中间节点没有卫星数据,只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少
2、其次,因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定。
b+树:
三、数据库
一、myisam
1、myisam不支持事务,不支持外键,支持表锁,每次锁住的是整张表(表共享读锁和表独占写锁,读锁不会阻塞其他用户,写锁是独占锁,当有写操作时,会阻塞对同一表的读和写的操作),读锁和写锁和互斥的,读写操作时串行的,一个请求读操作同时另一个请求发起写操作,写操作会先获得锁,如果此时读操作已经在等待队列,写操作后进来,那么写操作也会插到读操作的前边,因为mysql认为写操作比读操作重要,如果有大量的更新操作和读操作的应用就不适用于myisam存储引擎,因为大量的更新操作会阻塞很久,查询操作很难获得锁。
2、myisam表有三个文件,索引文件,表结构文件,数据文件
3、采用非聚族索引,索引文件的数据域存储指向数据文件的指针。
二、InnoDB
1、支持事物
事务具备四种特性:原子性、一致性、隔离性、持久性
事物的四种隔离级别:
1、读未提交,事物A把number从10修改为了20,事物B读取了更新后的值20,此时事物A进行了回滚把number回滚到10,此时事物B读取到的值20就是脏读,怎么解决脏读?读提交就能解决
2、读提交,就是一个事物要等另一个事物提交后才能读取数据,这样就能避免了脏读,但事物A读取了number10,事物B把number修改为了20,此时事物A再去读发现和第一次的不一样,出现了不可重复读,怎么解决不可重复读?重复读
3、重复读,就是读取数据时(事物开启),不再允许修改操作,避免了不可重复读,但不可重复读对应的是修改,即UPDATE操作,但可能出现幻读问题,因为幻读对应的是INSERT,例如事物A读取了表中的数据,但此时事物B进行了INSERT插入操作,事物A再读时发现了多出了一些信息,怎么解决幻读?serializable序列化
4、序列化,它是最高的事物隔离级别,在改级别下,事物串行顺序执行,可以避免脏读、不可重复读、幻读,但这种效率低下,消耗性能
InnoDB存储引擎,默认主键
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
感谢 https://www.cnblogs.com/ubuntu1/p/8999403.html文章的帮助