Java后台开发知识点

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 HASHBTREE
NDB HASHBTREE (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数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。
改进二:将原先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冲突

 

 

你可能感兴趣的:(java)