20200902面试过程中碰到的面试题

tech2022-07-15  163

一.什么时候索引会失效

1.联合索引使用的时候没有用到左列字段

2.使用了or,但是字段没有都加上索引,会导致加了索引的字段也不会被索引

3.like通配符在最左边,如like "%aa"

4.在索引上使用了函数,!=(或<>),not in等

5.如果where后面已经使用了索引,那么order by中的列是不会使用的

6.类型的隐式转换,如索引是字符串,但是使用的时候没有加引号

二.MySQL事务的隔离级别

脏读:A事务处理过程中读取了B事务未提交的数据

不可重复读:一个事务范围内两个相同的查询却返回了不同的数据(A读取数据,B更新数据并提交事务,A再次读取数据的时候,数据已经发生了改变)

幻读:无法控制其他事务对数据库的插入和删除,当再次查询的时候,可能会发现符合条件的数据变多

1.Read uncommitted(读未提交)

      A事务进行写操作的时候,B事务不能进行写操作但允许读操作。会出现脏读、不可重复读和幻读

2.Read committed(读提交)

      A事务可以读取B事务修改后提交的数据,不能读取B事务未提交的数据。会出现不可重复读和幻读

3.Repeatable read(可重复读)

      A事务多次读取同一数据,再这个事务还没有结束的时候,B事务不能访问该数据(读和写都不能)。可能会出现幻读

4.Serializable(可序化)

      要求事务一个接一个的执行,不能并发执行。是最高的隔离级别,性能很低

三.sql关键字的执行顺序

1.书写顺序

select、distinct、from、join、on、where、group by、having、union、order by、limit

2.执行顺序

from、on、join、where、group by、having、select、distinct、union、order by

四.内存溢出和内存泄漏

内存溢出(Out Of Memory)指要求分配的内存大小超过了系统能给出的最大值

内存泄漏(Memory Leak)指内存申请后,用完没有释放,造成可用内存越来越小

内存泄漏最终会导致内存溢出

五.java类加载过程

主要分为三部分:加载、连接和初始化,连接又可分为验证、准备和解析

加载指把class文件通过类加载器加载到内存中;验证主要是保证加载进来的字节流符合虚拟机规范,不会造成安全错误;准备主要是为类变量分配内存,并赋予初值;解析指将常量池内的符号引用替换为直接引用;初始化主要是对类变量进行初始化,是执行类构造器的过程

六.java内存分配

主要分为三个区,栈区,堆区和方法区

栈区:

每个线程包含一个栈区,栈内只保存基础数据类型本身和自定义对象的引用每个栈中的数据都是私有的

堆区:

存的全是对象,每个对象都包含与之对应的class信息jvm只有一个堆区,且被线程共享,堆中不存放基本类型和数据引用

方法区:

被所有的线程共享,包含所有的class和static变量方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

七.java垃圾回收机制

jvm内存结构分为五大区域:程序计数器、本地方法栈、虚拟机栈、堆区和方法区

GC的重点在堆区和方法区

判断一个对象是否存活的方法

引用计数法,目前主流虚拟机都不用可达性分析法,当一个对象在GC Roots不可达的时候,此对象就需要回收了

垃圾回收算法

标记清除法,分为标记和清除两个过程,会造成大量的内存碎片且效率不高复制算法,把内存分为两块每次只使用其中的一块,当用完了,就将还存活的对象复制到另一块标记整理算法,①标记存活的对象②被标记的移动到内存的另一端③清除边界以外的内存

分代回收算法(目前的主流算法)

将内存分为新生代、老年代和永久代,然后根据不同代的特点按照不同的算法进行回收

像新生代这种常常有大量对象死去的,用复制算法;老年代这种对象生存周期较长的,永久代这种存活率高的,就用标记清除算法或者标记整理算法

最新回复(0)