varchar(n)能存储多少个汉字
在字符集为UTF-8的情况下,若mysql version<4.1 varchar以字节为单位存储,对于varchar(255)共存放约85个汉字。若mysql version>=4.1 varchar以字符为单位存储,则varchar(255)可以存放255个汉字
三色标记算法思想
将对象的颜色分为了黑,灰,白三种颜色
白色:该对象没有被标记过(对象垃圾)
灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完(GC需要从此对象中去寻找垃圾)
黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了(程序所需要的对象)
定义一个springboot-starter
在META-INF/spring.factories包下添加自动配置的元数据
创建一个配置类,该类需要@Configuration和@EnableConfigurationProperties注解,启用定义的配置属性类
在applicaton.yml中配置starter里定义的属性
SPI机制:接口存在于调用方这边,由接口调用方确定接口规则,然后由不同的厂商根据这个规则对这个接口进行实现,从而提供服务
启动类加载器:负责加载Java的核心库,是JVM的一部分,启动类加载器无法被java程序直接引用
扩展类加载器:Java语言实现的,继承自ClassLoader类,负责加载Java扩展目录下的Jar包和类库
应用程序类加载器:java语言实现的,负责加载用户类路径上的指定类库,是我们平时编写java程序时默认使用的类加载器
自定义类加载器:开发者可以根据需求定制类的加载方式,比如从网络加载class ,数据库的加载类
synchronized 锁范围
锁住实例对象 public synchronized void method(){}
锁住类对象 public static synchronized void method(){}
锁住类的实例对象 synchronized(this){}
锁住该类的类对象 synchronized(SynchronizedDemo.class){}
==和equals()的区别
对于基本数据来说,==比较的是值
对于引用数据类型来说,==比较的是对象的内存地址
equals不能判断基本数据类型的变量,只能判断两个对象是否相等
Executors工具类默认线程池
FixedThreadPool:固定线程数量的线程池,该线程池中的线程数量始终不变,当有一个新的任务提交时,线程池中若有空闲线程,则立即执行,若没有,则新的任务会被暂存在一个任务队列中,待有线程空闲时,便处理在任务队列中的任务
SingleThreadPool:只有一个线程的线程池,若多余一个任务被提交到该线程池,任务会被保存到一个任务队列中,待线程空闲时,按先入先出的顺序执行队列中的任务
CachedThreadPool:可根据实际情况调整线程数量的线程池,线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程,若没有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用
ScheduledThreadPool:给定的延迟后运行任务或定期执行任务的线程池
字节流以字节为单位进行数据传输的,它可以处理任何类型的数据,包括二进制数据,直接处理二进制文件,图像,音频等非文本数据,字符流则更注重对文本的处理,包括字符的读取,写入和转换等
事务失效场景
try-catch异常捕获处理
抛出检查异常(rollback=exception.class)
非public方法的异常
进程和线程的区别
进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销,线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
进程中某个线程如果崩溃了,可能会导致整个进程都崩溃,而进程中的子进程崩溃,并不会影响其他进程
系统在运行的时候会为每个进程分配不同的内存空间,而对线程而言,除了CPU外,系统不会为线程分配内存,线程组之间共享资源
垃圾回收算法:标记-清除 复制算法 标记-整理 分代回收
MVCC(多版本并发控制)
记录中的隐藏字段
DB_TRX_ID:最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID
DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本
DB_ROW_ID:隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段
undo log版本链
ReadView
MyBatis缓存
一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存
二级缓存:是基于namespace和Mapper的作用域起作用的,不是依赖于SQL session,默认也是采用PerpetualCache,HashMap存储。需要单独开启。一个是核心配置,一个是Mapper映射文件
CPU飙高排查
使用top命令 查看进程 CPU占用
使用 ps 打印某个进程中各个线程的cpu占用
使用jstack 命令,打印各个线程