JAVA学习技术点
2020-03-06 17:13:06 0 举报
AI智能生成
java技术点总结
作者其他创作
大纲/内容
database
sql 优化
慢日志
"show variables like '%slow_query_log%'"
事务管理
索引失效
条件中有or关键字,并且index_merge_union参数不为on或数据量太少不需要走索引
like条件是以%开头的
字符串类型的列,值要用''括起来,不然不走索引
数据库制定执行计划时,认为全表扫描比走索引快
tomcat
启动加载过程
spring
bean加载过程
SpringApplication.run()中的refresh方法
refresh流程
this.processBeanFactory()
this.invokeBeanFactoryPostProcessor()
this.registerBeanPostProcessor()
this.initMessageSource()
this.initApplicationEventMulticaster()
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory)
this.finishRefresh()
作用
为IOC容器及bean的生命周期管理提供条件
刷新spring上下文信息,定义spring上下文加载流程
ctx.getBean()方法
逻辑
转换beanName
尝试从缓存中获取实例
实例化bean
检测parentBeanFactory
初始化依赖的bean
创建bean
bean的作用域
singleton
默认,容器里仅会创建一个实例
prototype
针对每一次getBean方法都会创建一个实例
request
每个http请求创建一个实例
session
每个session创建一个实例
globalSession
每个全局http session创建一个实例,仅对portlet有效
bean的生命周期-创建
实例化bean
Aware(注入beanID,applicationContext,beanFactory)
BeanPostProcessor.postProcessBeforeInitialization()
InitializingBean.afterPropertiesSets()
定制的bean init方法
BeanPostProcessor.postProcessAfterInitialization()
bean初始化完毕
bean的生命周期-销毁
若实现了disposableBean方法,则会调用destroy方法
若配置了destroy-method属性,则会按照其配置的方法进行调用销毁
IOC
思想:依赖倒置原则,高层模块不应该依赖底层模块,两者都应该依赖其抽象
思路:控制反转,IOC
方法:依赖注入
IOC Container优势:
避免在各处使用new来创建类,并且可以做到统一维护
创建实例的时候不需要了解其中的细节
AOP
织入方式
编译时织入,aspectJ
类加载时织入,aspectJ/aspectWerkz
运行时织入,spring采取的方式,通过动态代理方式,实现简单
实现
JDKProxy
核心
InvocationHandler接口和Proxy类
实现
通过java内部反射机制
CGLib
以继承的方式动态生成目标类的代理
借助ASM技术
代理模式
原理
接口+真实实现类+代理类
代理类和真实实现类要实现 接口
实例化代理类,替代真实实现类来对外提供服务
spring代理模式的应用
真正实现类的逻辑在getBean()方法里
getBean()方法实际返回的是Proxy的实例
Proxy实例是spring使用JDKProxy或者CGLib动态生成的
事务
ACID
atomic
原子性
consistency
一旦所有事务动作完成,事务就要被提交
isolation
可能多个事务会对同一个数据进行操作,所以事务之间要相互隔离,防止数据被损坏
durability
事务一旦完成,无论系统发生什么错误,都不能对结果产生任何影响
隔离级别
serializable
最严格,所有事务串行执行
repeatable read
保证事务不会修改另一个事务未提交或未回滚的数据
read committed(默认)
保证事务不会读取另一个事务未提交或未回滚的数据
read uncommitted
保证不会读取任何非法数据
事务传播
@Transactional(propagation=Propagation.REQUIRED) :如果外层调用方法本身有事务, 那么就加入到该事务中, 没有的话新建一个(这是默认的设置项)
@Transactional(propagation=Propagation.SUPPORTS) :如果外层调用方法存在事务,则加入该事务;如果外层调用方法没有事务,则以非事务的方式继续运行。
@Transactional(propagation=Propagation.NOT_SUPPORTED) :以非事务方式运行,如果外层调用方法存在事务,则把当这个事务挂起。
@Transactional(propagation=Propagation.REQUIRES_NEW) :不管外层调用方法否存在事务,都创建一个自己的事务,外层调用方法的事务挂起,自己的执行完毕,再执行调用方事务
@Transactional(propagation=Propagation.MANDATORY) :如果外层调用方法存在事务,则加入该事务;如果外层调用方法没有事务,则抛出异常
@Transactional(propagation=Propagation.NEVER) :以非事务方式运行,如果外层调用方法存在事务,则抛出异常。
@Transactional(propagation=Propagation.NESTED) :如果外层调用方法存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果外层调用方法没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED
springBoot
自动配置
springboot开启注解
@SpringBootApplication
@Configuration
@ComponentScan
@EnableAutoConfiguration
根据类路径下的jar包和配置动态加载配置和注入bean
这样能把许多功能做成公共的自动配置的启动器(starter)
如果是传统的项目,要写一大堆的配置,而且不灵活,有了启动器,就可以做到简单集成
原理
springCloud
断路器
原理
当一个服务调用另一个服务时,如果被调用者不稳定,会导致调用者一直等待响应,并且后续会有越来越多的调用者等待响应,产生连锁效应,断路器就是为了解决这个问题
状态
完全打开
一定时间内达到一定次数,并且经过多次检测没有恢复的迹象,那么后续所有请求都不会到达该服务器
半开
一定时间到达一定次数,经过检测有恢复的迹象,那么断路器会将部分请求分发到该服务器
关闭
正常工作
客户端负载均衡器
ribbon
基于HTTP和TCP的客户端负载均衡
在客户端中配置ribbonServerList 来设置服务端列表去轮询访问以达到均衡负载的作用
feign
Feign是一个声明式的Web Service客户端
使用Feign来创建一个接口并用注解来配置它既可完成
dubbo
协议
dubbo
缺省协议
采用单一长连接和异步NIO通讯
适用小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况
rmi
阻塞式(同步)短链接和JDK标准序列化方式
适用传入传出参数数据包大小混合,消费者和提供者个数差不多,可传文件
hessian
底层采用http通讯(同步),采用Servlet暴露服务
适用传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件
http
redis
配置信息
应用信息
注册中心相关信息
服务协议
所有暴露服务缺省值
暴露服务
引用服务缺省值
引用服务
集群容错
Failfast
Failsafe
Failback
Forking
Broadcast
负载均衡策略
Random LoadBalance
随机策略
RoundRobin LoadBalance
轮询策略
LeastActive LoadBalance
最少活跃调用
ConsistentHash LoadBalance
一致性hash策略
使用hash算法可以让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求
hash算法
余数hash
伸缩性太差,机器的加入退出会让映射关系大面积失效
一致性hash
通过维护一致性环,将服务器落在一致性环上,以后每次请求,通过用户id计算hash值,落入环中,并按照顺时针原则找到环中最近的服务器
每次新增删除服务器,能保证只有改动附近的请求映射发生变化
注册中心
zookeeper
宕机处理
注册中心全部宕机后,消费者和提供者能通过本地缓存进行通讯
注册中心的数据库宕机后,注册中心能通过缓存提供服务列表查询,但是不能注册新服务
奇数节点
leader选举时,要求"可用节点>总节点/2""
防止由于脑裂造成集群不可用
在容错能力相同的情况下,奇数台更节省资源
原理
zookeeper工作核心是原子广播,工作模式分为恢复模式和广播模式,恢复模式为选举leader,广播模式是为了实现leader和server之间进行状态同步
微服务
为什么使用微服务
服务之间独立部署,可以各自迭代开发部署
服务之间互不干扰,提高系统可用性和可靠性
分布式强调并行,微服务强调划分
集群是物理形态,分布式是工作方式,微服务是架构风格
原理
解析服务
针对dubbo标签,使用dubboBeanDefinitionParser进行解析,将XML标签解析成bean对象.在对生产者和消费者进行初始化的时候,将bean对象的属性转化成URI的一部分
暴露服务
直接暴露
直接调用服务url对应协议的export()方法,打开服务端口
注册中心暴露
调用服务url对应的export()方法,注册到注册中心
引用服务
直接引用
通过referenceConfig查找到的url是{protocol}://service-host/,再通过协议的refer()方法,返回服务的引用
注册中心引用
通过referenceConfig解析出来urlregistry://registry-host/com.alibaba.dubbo.registry.RegistryService?refer=URL.encode(“consumer://consumer-host/com.foo.FooService?version=1.0.0”),再通过协议头的refer()方法,得到服务的引用
ElasticSearch
index,type,document区别
常用的数据操作
查索引,建索引
curd文档
搜索
原理
es是一个基于lucence的可扩展分布式实时搜索和分析引擎,使用倒排索引(比关系型数据库的B-TREE索引更快)
分级索引
term Index
term dictionary
posting list(针对每个field的term都维护一个list,记录文档的id)
多线程
synchronize
对象锁
同步代码块
synchronized(this)锁是当前类实例对象
同步非静态方法
锁是当前对象的实例对象
类锁
同步代码块
synchronized(Class)锁是当前类
同步静态方法
锁是当前对象的类对象
创建线程
Thread类
callable接口
可以使用Future接收返回值
runnable接口
wait和sleep区别
wait会释放锁或监视器,适用于线程间通讯
sleep是执行时暂停,不会释放锁或监视器
线程池
创建方式
Executors
SingleThreadPool
FixedThreadPool
CachedThreadPool
ThreadPoolExecutor
FixedThreadPool
SingleThreadExecutor
CachedThreadPool
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor
SingleThreadScheduledExecutor
各种方式的优缺点
线程池参数
corePoolSize(线程池基本大小)
能执行任务的线程数,每次提交一个任务到线程池时,线程会创建一个线程来执行任务,即使其他空闲基本线程能执行新任务;如果调用了prestartAllCoreThreads()方法,则会提前创建并启动所有基本线程
runnableTaskQueue(任务队列)
用于保存等待执行的任务的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
MaxPoolSize(线程池允许创建的最大线程数)
如果队列满了,且已经创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务.如果使用了无界的任务队列这个参数就没效果
RejectedExecutionHandler
原理
当队列和线程池都满了,说明线程池处于饱和状态,那么必须使用 一种策略来处理提交的新任务
处理方式
AbortPolicy
直接抛出异常
CallerRunsPolicy
只用调用者所在线程来运行任务
DiscardOldestPolicy
丢掉队列里最近的的一个任务,并执行当前任务
DiscardPolicy
不处理,直接丢弃
关闭线程池
shutdownNow
将线程池状态置为STOP,并尝试停止所有正在执行或暂停的线程任务,并返回等待执行任务的列表
shutdown
将线程池状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程
不适用executors的原因
Executors使用默认参数创建线程,特别是RejectedExecutionHandler(拒绝策略)参数,能在当队列和线程池满的情况下,采用策略来处理新提交的方式
AbortPolicy直接抛出异常
CallerRunsPolicy只用调用者所在线程来运行任务
DiscardOldestPolicy丢掉队列里最近的一个任务,并执行当前任务
DiscardPolicy不处理,直接丢弃
java基础
jvm虚拟机
java反射
ClassLoader
双亲委派机制
自底向上检查类是否加载
CustomClassLoader->AppClassLoader->ExtensionClassLoader->BootstrapClassLoader
通过parent.loadClass()方法来检查是否已经加载
自顶向下尝试加载类
"Load JRE\lib\rt.jar或Xbootclasspath指定的jar包"->"Load JRE\lib\ext\*.jar或-Djava.ext.dirs指定下的jar包"->"Load CLASSPATH或Djava.class.path所指定的目录下的类和jar包"->"通过java.lang.ClassLoader的子类自定义加载的class"
双亲委派防止类重复加载
loadClass()方法的实现
先判断c是否为空,为空使用c = parent.loadClass()进行向上检查,如果还是为空,执行c = findClass(),从而实现自顶向下加载
举例反射使用
类装载过程
加载
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3)在java堆中生成一个代表这个类的Class对象,作为访问方法区中这些数据的入口。
加载的时候第三步生成的Class对象的作用是作为入口,而真正的对象是经过加载、连接后才能初始化的,Class对象是一个特殊的对象,不同于普通对 象,因此可以在加载的时候生成。
加载的时候第三步生成的Class对象的作用是作为入口,而真正的对象是经过加载、连接后才能初始化的,Class对象是一个特殊的对象,不同于普通对 象,因此可以在加载的时候生成。
链接
垃圾回收GC
判断是否垃圾
引用计数算法
缺点
无法检查循环引用
优点
高效
可达性分析
原理
从GC Root开始检索,查看引用链能不能达到要收集的对象(图论原理)
GC ROOT
虚拟机栈中引用的对象(栈帧中的本地变量表)
方法区中常量引用的对象
方法区中类静态属性引用的对象
本地方法栈中JNI(native方法)引用的对象
活跃线程的引用对象
回收算法
标记-清除算法
复制算法
原理
将内存分为空闲面和对象面
对象从对象面创建,存活的对象从对象面复制到空闲面
触发回收时整个对象面清除
标记-整理算法
原理
扫描一遍内存,将存活的内存标记出来
执行回收,将存活的对象移动到内存一端,将标记末端的内存清空
分代收集算法
按照对象生命周期的不同划分不同的内存区域,采用不同的垃圾回收算法
分代
年轻代(1/3)
eden区
两个survivor区
对象每存活一次,年龄计数+1, 通过-XX:maxTenuringThreadhold来调整,默认15,达到阈值后,将对象转移到老年代
老年代(2/3)
晋升为老年代
经历一定次数的minorGC
survivor空间不足
第一次分配大对象,-XX:PretenuerSizeThreadhold
持久代(jdk7及以前才有)
收集时机
minorGC
当eden区满了,触发minorGC,将存活对象转移到其中一个survivor区,再清理所有eden区和另一个survivor区中的对象,并使存活的对象年龄计数+1
fullGC
对整个堆进行垃圾回收
内存模型
程序计数器
线程当前执行的字节码行号指示器
本地方法栈
java本地方法的调用栈
虚拟机栈
以栈帧为基本单位的结构,表述了方法的调用顺序,栈帧内包括局部变量表、操作数栈、动态链接、方法出入口
java堆
所有线程共享的内存区域,一般用来存放对象实例及数组,垃圾收集器的主要区域,划分为老年代和新生代
方法区
所有线程共享的内存区域,存放虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
参数调优
8种基础数据类型
int
Integer
32bit
long
Long
64bit
short
Short
16bit
char
Character
16bit
byte
Byte
8bit
double
Double
64bit
float
Float
32bit
bool
Boolean
1bit
数据框架
Map
HashMap
底层数据结构
数组加单链表的形式
使用数组存key的hash值
hash所在的数组位置保存相同hash的key-value的单链表
先找到key的hash位置,在通过key的equals方法,找到单链表存储key的位置,从而获取value
HashTable
ConcurrentHashMap
jdk8+
数组+红黑树
jdk7
数组+segment+分段锁
红黑树
规则
节点是红色或黑色
根节点是黑色
每个叶子节点都是黑色的空节点
每个红色节点的两个子节点都是黑色
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
SortedMap
TreeMap
Collection
List
Vector
stack
ArrayList
LinkedList
Set
HashSet
SortedSet
TreeSet
Array
J.U.C
同步器
CountdownLatch
CyclicBarrier
Semaphore
Exchanger
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
...
JAVA IO
BIO
NIO
channel
buffer
selector
AIO
new 和 newInstance()
new关键字可以在类没有初始化的时候使用,即new会进行类的初始化和连接
newInstance()必须保证类被初始化加载和链接
final作用
重载和重写
各种排序算法
绿动project
Controller
Service
ServiceImpl
DAO
DTO
Utils
Resources
0 条评论
下一页