1、sleep和wait的区别,sleep不释放锁,wait释放锁,两者均释放CPU资源
2、redis数据类型:string(set),hash(hset),list(lpush),set(sadd)和zset(zadd)
3、线程池相关:
四种线程池:CachedThreadPool,使用阻塞队列实现,一个任务提交后,在core pool中必须有一个线程接收,否则在core pool外新建一个线程处理,上限为INTEGER最大值或maxsize值;FixedThreadPool,使用无界队列实现,core pool保留core数量的线程数以接收任务,任务超出coresize后进入队列;SingleThreadPool:FixedThreadPool coreSize=1
4、JVM内存回收机制:堆(保存对象实例),栈(保存局部变量、操作栈等),方法区(保存类加载信息、常量、静态变量等),程序计数器(保存字节码行号);堆分为新生代和老年代,新生代分为Eden,survivor0和suvivor1区,新对象先进入Eden,Eden满后触发一次MinorGC(新生代GC)转入survivor0,survivor0满后触发一次MinorGC会转入survivor1,多次(默认15次)MinorGC后仍然存活便进入老年代。老年代执行MajorGC(老年代GC)时所有线程均停止。新生代采用复制清除的GC方式,老年代采用标志清除的GC方式。使用可达性分析算法回收,其root对象包括:被加载的类和创建的对象;方法区中的静态变量和常量;当前线程中的虚拟栈中的对象;本地方法栈(JNI)中的对象;
垃圾回收器类型:
Serial收集器:单线程,收集年轻代
ParNew收集器:多线程,收集年轻代
Parallel Scavenge(并行回收)收集器:多线程,收集年轻代,以吞吐量为目标
Serial Old 收集器:Serial收集器的老年代版本
Parallel Old 收集器:Parallel Scavenge的老年代版本
CMS收集器:步骤:初始标记(STW),并发标记,重新标记(STW),并发清除;老年代;标记清除,碎片多
G1收集器:步骤:初始标记,并发标记,最终标记,筛选清除;新生代+老年代
5、MySQL索引类型:主键索引(不可空),唯一索引(可有一个空),全文索引(类似单词匹配,某些情况可替代like '%%'),普通索引,多列索引(使用最左字段才能走索引),(位图索引);索引方法:BTree,适用范围查询;Hash,适用等值查询。innodb不支持hash索引,但是可以使用自适应hash索引,在查询的时候于内存中动态构建。索引失效情况:条件中有or且or左右的条件列有的没有建索引,like '%%', 多列索引不使用第一个,查询条件带有隐式转换或函数,优化器认为索引没有全表快(表小或者索引列枚举少);<=>操作符是在=的基础上增加了对null的支持,相当于=和is null的功能叠加
以下表格引用自:https://dev.mysql.com/doc/refman/5.7/en/create-index.html
Storage Engine | Permissible Index Types |
---|---|
InnoDB |
BTREE |
MyISAM |
BTREE |
MEMORY /HEAP |
HASH , BTREE |
NDB |
HASH , BTREE (see note in text) |
Table 13.2 InnoDB Storage Engine Index Characteristics
Index Class | Index Type | Stores NULL VALUES | Permits Multiple NULL Values | IS NULL Scan Type | IS NOT NULL Scan Type |
---|---|---|---|---|---|
Primary key | BTREE |
No | No | N/A | N/A |
Unique | BTREE |
Yes | Yes(唯一索引可以多空,已测) | Index | Index |
Key | BTREE |
Yes | Yes | Index | Index |
FULLTEXT |
N/A | Yes | Yes | Table | Table |
SPATIAL |
N/A | No | No | N/A | N/A |
6、SpringMVC处理一个请求的流程:DispatcherServlet前端控制器接收请求,转发给HandlerMapping映射器;HandlerMapping映射器根据其路径找到相应的Controller;Controller处理请求,返回ModelAndView;ViewResolver视图解析器根据其中的内容解析视图,将其中的Model数据渲染到View上。DispatcherServlet由web.xml中的servlet配置项配置,包括其中的拦截路径
7、web.xml加载顺序为:context-param(初始化参数)---listener(监听application,session,request的状态及其内容变化)---filter(对请求进行过滤或修改)---servlet(处理请求的服务),拦截器(切面,代理了controller的实现,可以在处理过程中的方法前后进行操作)在spring或Struts等框架中配置,不属于web.xml的配置
8、MySQL事务属性:A(原子性,操作不可分割)C(一致性,完整性约束未被破坏)I(隔离性,不同事务同一数据请求冲突)D(持久性,不可回滚);事务隔离级别:read uncommitted(会引发脏读,不可重复读,幻读),read committed(会引发不可重复读,幻读),repeatable read(会引发幻读,默认隔离级别),serializable(可串行化,事务锁表);传播行为:7种,最常用为PROPAGATION_REQUIRED:没有事务则创建,有事务则加入;其他为PROPAGATION_NESTED:没有事务则创建,有事务则嵌套在内;PROPAGATION_SUPPORTS:没有事务以非事务执行,有事务则加入;PROPAGATION_MANDATORY:没有事务抛出异常,有事务则加入;PROPAGATION_REQUIRES_NEW:总是创建新事务;PROPAGATION_NOT_SUPPORTED:没有新事务则运行,有新事务则挂起事务;PROPAGATION_NEVER:没有事务则运行,有事务则抛出异常。
9、ConcurrentHashMap在jdk1.8中主要做了2方面的改进
改进一:取消segments字段,直接采用transient volatile HashEntry
改进二:将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构。对于hash表来说,最核心的能力在于将key hash之后能均匀的分布在数组中。如果hash之后散列的很均匀,那么table数组中的每个队列长度主要为0或者1。但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);因此,对于个数超过8(默认值)的列表,jdk1.8中采用了红黑树的结构,那么查询的时间复杂度可以降低到O(logN),可以改进性能。
TreeMap以key进行排序;LinkedHashMap以先后顺序排序。
ConcurrentSkipListMap基于跳表结构,为节点多增加了前后若干个元素的引用,加快了查找速度,同时保持节点有序排列;其线程安全的原理与非阻塞队列ConcurrentBlockingQueue的原理一样:利用底层的插入、删除的CAS原子性操作,通过死循环不断获取最新的结点指针来保证不会出现竞态条件。
CopyOnWriteArrayList读时将原数组复制一份,因此无锁;写时使用lock锁定,同时复制一份进行编辑,再讲引用指向复制对象
10、volatile的功能:保证了变量在多线程中的可见性;禁止指令重排。原理为编译时该行会加入lock前缀,形成内存屏障
ThreadLocal将各个线程中的变量统一管理,其适用性和线程局部变量差别不大
LongAdder分cell进行CAS同步,减少CAS冲突