jvm、树、数据库存储引擎知识总结

一、jvm相关

1、java执行流程以及五个运行时区

2、 我们在IDE中编写的java源代码被编译器编译成.class字节码文件,然后由我们的ClassLoader负责将这些class文件加载到JVM中去执行。

3、双亲委派机制,当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载到,自己才会去加载这个类。这样设计有个好处,如果有人想替换系统级别的类,比如String,篡改它的实现,但是在双亲委派机制下这些系统类已经被classloader加载过了,不会再去加载篡改后的类,从一定程度上防止了危险代码的植入。

4、五大运行时区

程序计数器:当前线程所执行的字节码的行号指示器,为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器,互不影响,独立存储,我们称之为“线程私有”,他也是java虚拟机规范中没有规定任何oom情况的区域

虚拟机栈:线程私有,生命周期和线程相同,它是描述java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接等信息,每个方法从调用到执行完成的过程,就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程

本地方法栈:与虚拟机栈是十分相似的,区别就是虚拟机栈执行的是java方法,本地方法栈则是为native方法服务,虚拟机栈和本地方法栈都可能抛出StackOverflowError和OutOfMemoryError异常。

:内存共享的区域,所有的对象实例和数组都要在堆上分配,几乎所有的对象都在这里分配,但随着JIP编译器的发展,技术逐渐成熟,栈上分配、标量替换优化技术会导致一些微妙的变化发生,这让所有的对象都在堆上分配变的不那么“绝对”了。

方法区:线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量等信息,虽然java虚拟机规范把方法去描述为堆的一个逻辑部分,但他还有一个别名Non-heap(非堆)目的就是和java堆分开。

5、堆中发生的变化,jdk1.7是永久代它存放的是应用中的类和方法,当永久代满了或者超过临界值,会触发Full GC,jdk1.8是元空间,他取代了永久代,它是与堆不相连的本地空间

五个运行时区解释:

JDK1.8

从上述结果可以看出,JDK 1.6下,会出现“PermGen Space”的内存溢出,而在 JDK 1.7和 JDK 1.8 中,会出现堆内存溢出,并且 JDK 1.8中 PermSize 和 MaxPermGen 已经无效。因此,可以大致验证 JDK 1.7 和 1.8 将字符串常量由永久代转移到堆中

二、树相关

二叉树、完全二叉树、平衡二叉树、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存储引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址

在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针(记录了地址)

聚族索引:聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页,一般建表会用一个自增主键做聚簇索引,没有的话MySQL会默认创建

非聚族索引:非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据 

感谢 https://www.cnblogs.com/ubuntu1/p/8999403.html文章的帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM垃圾回收是Java虚拟机的一个重要功能,它的知识体系包括以下内容: 1. 垃圾回收算法:垃圾回收算法是指垃圾回收器采用的垃圾回收策略。常见的垃圾回收算法包括标记-清除、复制、标记-压缩和分代等。 2. 垃圾回收器:垃圾回收器是JVM的一个组成部分,它负责执行垃圾回收算法,并回收Java对象的内存空间。常见的垃圾回收器包括Serial、Parallel、CMS、G1等。 3. 对象存活判定:垃圾回收器需要判断哪些Java对象是可以回收的,哪些是必须保留的。存活对象可以通过引用计数、可达性分析等方式判断。 4. 垃圾回收的过程:垃圾回收的过程包括标记、清除、整理等阶段。标记阶段是找到存活对象的过程,清除阶段是回收无用对象的过程,整理阶段是将存活对象移动到一块连续的内存区域中。 5. 垃圾回收的性能优化:垃圾回收的性能优化包括分代、增量、并发、预处理等技术。分代是指将Java对象分为年轻代和老年代,以便针对不同的对象有针对性地进行垃圾回收。 6. 垃圾回收的调优和监控:垃圾回收的调优和监控可以通过调整堆大小、设置垃圾回收器类型、调整垃圾回收的参数等方式实现。 JVM垃圾回收是Java虚拟机的一个重要功能,掌握其知识体系可以帮助程序员更好地理解Java程序的内存模型和垃圾回收机制,从而编写出高效、可靠的Java程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值