MyISAM与InnoDB 的区别:
InnoDB支持事务,MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB是聚集索引,MyISAM是非聚集索引
Innodb不支持全文索引,而MyISAM支持全文索引
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
InnoDB表必须有唯一索引(如主键)
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
快速失败和安全失败
快速失败:集合遍历的时候如果内容改变,会改变modcount的值,每次迭代的时候会对比
modcount和expectedmodcount,如果不一致,会抛异常
安全失败:在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历,
由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,
故不会抛 ConcurrentModificationException 异常
父子线程怎么共享数据
InheritableThreadLocal:创建子线程时,如果parent的inheritableThreadLocals不是null,
那么就会将当前线程的inheritableThreadLocals设置为parent的inheritableThreadLocals
transmittable-thread-local:holder
CountDownLatch、CyclicBarrier和Semaphore
CountDownLatch:允许一个或多个线程一直等待,直到一组在其他线程执行的操作全部完成
CyclicBarrier:一组线程会互相等待,直到所有线程都到达一个同步点
Semaphore:用来控制同一时间,资源可被访问的线程数量,一般可用于流量的控制
Buffer Pool和Change Buffer
Buffer Pool(缓冲池):缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO。
InnoDB对普通LRU进行了优化:将缓冲池分为老生代和新生代,入缓冲池的页,优先进入老生代,页被访问,
才进入新生代,以解决预读失效的问题。
页被访问,且在老生代停留时间超过配置阈值的,才进入新生代,以解决批量数据访问,大量热数据淘汰的问题
change buffer:适用非唯一普通索引页,当需要更新一个数据页时,
如果数据页在内存中就直接更新。如果数据页不在内存中。在不影响数据一致性的前提下,InooDB 会将这些更新操作
缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,
将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性
可达性分析算法中根节点有哪些
方法区中常量引用指向的对象
方法区中静态属性引用指向的对象
虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象
Native 方法中 JNI 引用的对象
循环依赖
Spring的单例对象的初始化主要分为三步
1、createBeanInstance:实例化,其实也就是调用对象的构造方法实例化对象
2、populateBean:填充属性,这一步主要是多bean的依赖属性进行填充
3、initializeBean:调用spring xml中的init 方法
循环依赖主要发生在第一、第二步。也就是构造器循环依赖和field循环依赖。
三级缓存,提前曝光
对象
对象头--对象体--对齐字节
对象头(markword,类型指针)
类型指针:只想方法区中的class信息,说明这个对象属于哪个类
markword:锁状态,偏向锁标志位,锁标志位,hashcode,分代年龄
偏向锁:把markword的线程ID改为自己线程ID的过程
轻量级锁:线程在自己的线程栈生成LockRecord ,用CAS操作将markword设置为指向自己这个线程的LR的指针
重量级锁:只想互斥量的指针
逃逸分析
逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
使用逃逸分析,编译器可以对代码做如下优化:
一、同步省略。如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。
二、将堆分配转化为栈分配。如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。
三、分离对象或标量替换。有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在CPU寄存器中。
内存溢出区域
1、类加载加载可执行文件到 Metaspace,Metaspace 保存类的基本信息,如果加载太多就会 OOM
2、线程中的栈
3、堆内存(高并发场景下,请求量太大,创建了大量新的对象,内存泄漏)
finally
1、finally语句在try和catch语句中的return执行后、返回前执行;
2、若finally语句中没有return,则其执行结果不影响try和catch中已确定的返回值;
3、若finally语句中有return,则其执行后的结果会直接返回。