需要复习内容
2020-05-25 14:08:57 0 举报
AI智能生成
java面试总结 后续持续更新
作者其他创作
大纲/内容
java基础
jvm
内存模型
堆
存放对象实例
堆大小等于=新生代+老年代。java8没有永久代
其中新生代被分为Eden和S0和S1
Eden:from:to = 8:1:1;可以通过-XX:SurvivorRatio来设定
栈
虚拟机栈
java方法执行内存模型,对应着一个栈帧在虚拟机中从入栈到出栈的过程
本地方法栈
为虚拟机使用到的Native方法服务
方法区
存放已虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
程序计数器
直接内存
1.8取消永久代,变为元数据区
堆内存溢出
不断创建对象,堆内存限制后,产生内存溢出异常
垃圾回收机制
引用计数法
利用计数器
无法解决循环引用问题
GCRoot算法
只有能够被根对象集合直接或者间接连接的对象才是存活对象
垃圾回收算法
标记清除
复制
新生代
标记整理
年老代
类加载过程
加载->验证->准备->解析->初始化->使用->卸载
cpu使用率高定位
top->jstack->jmap
cms
最短回收停顿时间为目标的收集器
基于标记-清除算法
主要针对年老代进行回收
步骤
初始标记
并发标记
并发预清理
可被终止的预清理
重新标记
并发清除
并发重置
缺点
会产生空间碎片
可以通过XX:+UseCMSCompactAtFullCollection和XX:+CMSFUllGCBeforeCompaction来调整
消耗更多的CPU资源
堆空间利用率降低
集合
hashmap和hashtable区别
hashmap线程非安全,可以接受null为主键,但只能一个
hashtable父类是Dictionnary,是线程安全的,由sychronized修饰
hashmap
1.7
数组+链表
头插
rehash时会产生环形链
1.8
数组+链表+红黑树
尾插
扩容机制
loadFactory默认0.75
创建一个空数组重新hash
线程不安全
2的幂次
方便位运算
均匀分布
重写equals必须重写HashCode
concurrentHashMap
1.7
数组+链表
segment分段锁
继承了reetrantlock
尝试获取锁存在并发竞争 自旋 阻塞
get高效 volatile修饰 不需要加锁
volatiel修饰节点指针
HashEntry
1.8
数组+链表+红黑树
CAS+synchronized
cas失败自旋保证成功
再失败就sync保证
node
ArrayList
数组
查找访问速度快 增删效率低
线程不安全
LinkedList
集合所有类
1.8新特性
Lambda语法
datetime
optional
stream
线程池
corePoolSize
maxCorePoolSize
keepaliveTime
unit
workQueue
threadFactory
handler
AbortPolicy
CallerRunPolicy
DiscardOldestPolicy
DiscardPolicy
多线程
wait notify sleep
sleep属于thread类,不会释放锁,有监听器,到指定时间会自动激活
wait属于object类,会释放锁,通过notify()通知,才会唤醒
CountDownLatch
一个线程或多个等待另外n个线程完成之后才能执行
计数器只能使用一次
子主题
CyclicBarrier
计数器可以重置(通过reset()方法)
n个线程相互·等待,任何一个线程完成之前,所有的线程都必须等待
Semaphore
用来控制同时访问资源的线程数量
应用场景:流量控制,比如数据链接,限流等
AQS
用来构建锁和同步器的框架
nio
channel
双向的
buffer
读取或写入必须进过
是个连续数组
selector
监听多个通道事件
管理多个事件,避免上下文切换,节约了系统开支
锁
锁类和对象锁的区别
1 无论是修饰方法还是修饰代码块都是 对象锁,当一个线程访问一个带synchronized方法时,由于对象锁的存在,所有加synchronized的方法都不能被访问(前提是在多个线程调用的是同一个对象实例中的方法)
2 无论是修饰静态方法还是锁定某个对象,都是 类锁.一个class其中的静态方法和静态变量在内存中只会加载和初始化一份,所以,一旦一个静态的方法被申明为synchronized,此类的所有的实例化对象在调用该方法时,共用同一把锁,称之为类锁。
2 无论是修饰静态方法还是锁定某个对象,都是 类锁.一个class其中的静态方法和静态变量在内存中只会加载和初始化一份,所以,一旦一个静态的方法被申明为synchronized,此类的所有的实例化对象在调用该方法时,共用同一把锁,称之为类锁。
设计模式
创建型模式(5种)
工厂方法模式
抽象工厂模式
单例模式
建造者模式
原型模式
结构型模式(7种)
适配器模式
装饰器模式
代理模式
外观模式
桥接模式
组合模式
享元模式
装饰模式
行为型模式(11种)
策略模式
模版方法模式
观察者模式
迭代器模式
责任链模式
命令模式
备忘录模式
状态模式
访问者模式
中介者模式
解释器模式
代理模式—在AOP和remoting中被用的比较多。
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
工厂模式—BeanFactory用来创建对象的实例。
适配器–spring aop
装饰器–spring data hashmapper
观察者– spring 时间驱动模型
回调–Spring ResourceLoaderAware回调接口
前端控制器–spring用前端控制器DispatcherServlet对请求进行分发
单例模式—在spring配置文件中定义的bean默认为单例模式。
模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
工厂模式—BeanFactory用来创建对象的实例。
适配器–spring aop
装饰器–spring data hashmapper
观察者– spring 时间驱动模型
回调–Spring ResourceLoaderAware回调接口
前端控制器–spring用前端控制器DispatcherServlet对请求进行分发
消息中间件
Rocketmq
nameServer
注册中心
broker
提供关于消息的管理、存储、分发等功能,是消息队列的核心组件
producer
customer
mybatis
核心组件
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
Sql Mapper
即可以发送sql去执行结果,也可以获取Mapper的接口
一级缓存
sqlsession
最多缓存1024条sql
默认情况是开启的
结构是map
二级缓存
mapper
sqlsession是可以共享的
cachenabled是全局开关,默认开启
分页插件的原理
实现提供的接口,实现自定义插件,在插件的拦截方法内拦截sql,重写sql
分布式
cap原理
一致性,可用性,分区容忍性
任何分布式系统只可同时满足两点,没法三者兼顾
rpc原理
即远程过程调用,一种让调用远程服务像调用本地服务一样的一种方式
动态代理
序列化
nio
服务注册中心(zookeeper,consul)
spring
ioc
控制反转,是面向对象编程的一种设计原则,降低代码的耦合
反射
aop
核心概念
切面
横切关注点
连接点
切入点
通知
目标对象
织入
引入
应用场景
权限
缓存
内容传递
错误处理
懒加载
调试
记录跟踪
同步
事务
资源池
事务注解
@transnational
抽象工厂和ioc的区别
抽象工厂需要修改方法,ioc由于利用的反射原理只需要修改相应的属性
ioc低侵入性
访问流程
核心配置
bean的生命周期
springmvc执行流程
事务的传播行为
REQUIRED
REQUIES_NEW
SUPPORTS
NOT_SUPPORTED
MANDATORY
NEVER
NESTED
springboot
相比spring的优势
创建独立的Spring应用程序
嵌入的Tomcat,无需部署war文件
简化Maven 配置
自动配置Spring
提供生产就绪型功能,如指标,健康检查和外部配置
绝对没有代码生成和对xml没有要求配置
启动流程
创建SpringApplication实例
/META-INF/spring.factories 文件
将传入的启动类"com.example.ms.DemoApplication"放入Set集合中
判断是否为Web环境:存在(javax.servlet.Servlet && org.springframework.web.context.ConfigurableWebApplicationContext )类则是
创建并初始化ApplicationInitializer列表 (spring.factories)
创建并初始化ApplicationListener列表 (spring.factories)
初始化主类mainApplicatioClass (DemoApplication)
判断是否为Web环境:存在(javax.servlet.Servlet && org.springframework.web.context.ConfigurableWebApplicationContext )类则是
创建并初始化ApplicationInitializer列表 (spring.factories)
创建并初始化ApplicationListener列表 (spring.factories)
初始化主类mainApplicatioClass (DemoApplication)
启动run方法
创建计时器StopWatch
配置awt系统属性
获取SpringApplicationRunListeners
启动SpringApplicationRunListeners
创建ApplicationArguments
创建并初始化ConfigurableEnvironment
打印Banner
创建ConfigurableApplicationContext
准备ConfigurableApplicationContext
刷新ConfigurableApplicationContext
容器刷新后动作
SpringApplicationRunListeners发布finish事件
计时器停止计时
配置awt系统属性
获取SpringApplicationRunListeners
启动SpringApplicationRunListeners
创建ApplicationArguments
创建并初始化ConfigurableEnvironment
打印Banner
创建ConfigurableApplicationContext
准备ConfigurableApplicationContext
刷新ConfigurableApplicationContext
容器刷新后动作
SpringApplicationRunListeners发布finish事件
计时器停止计时
启动类注解
@SpringbootApplication
@SpringbootConfiguration
@EnableAutoConfiguration
@ComponentScan
自动配置原理
@EnableAutoConfiguration该注解引入了AutoConfigurationImportSeletor,该类中的方法会扫描/META-INF/spring.factories的jar包
springcloud
怎么使用
eureka 服务注册和发现
比zookeeper的优势在哪里
zookeeper保证了cp eureka保证了ap
可以很好的应对因网络故障导致部分节点失去联系的情况
zuul 注册网关
优点
方便监控
方便认证
隐藏架构实现细节,提供统一的入口给客户端请求,减少客户端与每个微服务的交互次数
可以统一处理切面任务
高可用高伸缩性的服务,避免单点失效
过滤器
pre 可以在请求被路由之前调用
适用于身份认证
route 在路由请求时被调用
适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑
post 在route 和 error后被调用
适用于需要添加响应头,记录响应日志等场景
error 处理请求时发生错误时被调用
可以用来统一记录错误信息
feign 简化接口调用
优点
基于接口的注解
整合ribbon,具有负载均衡的能力
整合hystrix,具有熔断的能力
Hystrix 熔断
熔断:当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止堆该服务的调用
降级:当服务器压力剧增的情况下,根据当前业务情况及流量堆一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行
ribbon 客户端负载均衡
@LoadBalanced
RandomRule:随机
RoundRobinRule:轮询
RetryRule:重试
WeightedResponseTimeRule:权重
服务续约
在注册完服务后,服务提供者会维护一个心跳来向注册中心证明自己还活着,以此防止被剔除服务
mysql
调优策略
应用层架构优化
减少对数据库的调用次数
引入缓存
将多次单个调用改为批量调用
使用搜索引擎
数据库架构优化
优化各种配置
优化sql及索引
优化数据表结构
优化系统配置
优化硬件配置
聚合函数和非聚合函数的区别
多行数据合并成一行的函数类似sum avg
一行一行计算的函数 len
联合主键
指用2个或者是2个以上的字段组成的主键,用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且附加上了主键索引。
分库分表
垂直分割
就是将一个表按照字段来分,每张表保证有相同的主键就好。一般来说,将常用字段和大字段分表来放。
优势:比没有分表来说,提高了查询速度,降低了查询结果所用内存;
劣势:没有解决大量记录的问题,对于单表来说随着记录增多,性能还是下降很快;
优势:比没有分表来说,提高了查询速度,降低了查询结果所用内存;
劣势:没有解决大量记录的问题,对于单表来说随着记录增多,性能还是下降很快;
水平分割
hash自增id取模
按时间
按每个表的固定记录数
将老数据迁移到一张历史表
事务隔离级别,默认是什么
未提交读,已提交读,可重复读,串行化
默认隔离级别是可重复读
事务特性和原理
原子性
有Undo Log保证,发生错误时进行回滚
一致性
由其他三者保证
隔离性
mvcc和lock保证
持久性
Redo Log保证
mvcc
多版本并发控制系统,InnoDB的MVCC时通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存行的过期时间。存储的是系统版本号。类似于乐观锁
慢查询分析 explain
BTree机制
脏读和幻读,如何避免
mvcc
实现方式:事务以排他锁的方式修改原始数据,把修改前的数据存放在Undo Log,通过回滚指针与数据关联,如果修改成功,什么都不做,如果修改失败,则恢复UndoLog中都数据
锁
回表
非主键索引需要多走一个索引树
如何避免
索引覆盖被查询的字段
主键和唯一索引的区别
本质区别,主键是一种约束,唯一索引是一种索引
主键不能有空值,唯一索引可以为空
主键可以是其他表的外键,唯一索引不可以
一个表只能有一个主键,唯一索引可以多个
主键->聚簇索引,唯一索引->非聚簇索引
锁
加锁机制
悲观锁
for update
乐观锁
版本号或者cas
兼容性
排他锁
加锁方式
for update
update,insert ,delete自动加
共享锁
select后加lock in share mode
加锁范围
全局锁
表级锁
表锁
元数据锁
5.5后引入
行锁
记录锁
单个行记录上的锁
间隙锁
锁定范围但不包含记录本身
防止间隙内有新数据插入
Next-Key锁
锁定一个范围,并且锁定记录本身
主要解决幻读
分布式事务解决方案
2PC
表决阶段
执行阶段
TCC方案
保证强一致性
对业务侵入太大,而且实现难度大
confirm和cancel接口必须实现幂等
基于消息的最终一致性
需要消息中间件支持事务消息
对业务代码的侵入性很高
本地消息表
本地消息表和业务数据表处于同一个数据库中,保证两个表的操作满足事务特性
使用消息队列来保证最终一致性
本质是将分布式事务拆成两个本地事务,但同时业务会和消息强耦合,对业务的侵入性也很高
步骤
完成业务数据操作后向本地消息表发送一个消息,本地事务能保证一定会被写入表中
之后将本地表中的消息转发到消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新发送
另一方从消息队列中读取一个消息,并执行消息中的操作
数据结构
红黑树
高度过大,磁盘IO读写过于频繁,效率低下
无法利用局部性原理
B+ tree
将所有的data数据都保存到了叶子节点中,非叶子节点只保存索引和指针
根节点是常驻内存的,因此每次查找只需要大约2-3次IO,就是根据机械磁盘的特性设计的
B tree
会将数据也保存在非叶子节点
导致非叶子结点不能存储大量的索引
redis
数据类型
string
set
sortedset
hash
list
使用场景
缓存热点数据
解决应用耦合,异步消息,流量削峰
排行榜
计数器
分布式锁
特性
单线程
持久化保存在内存
rocketmq
多master模式(推荐)
配置简单,单个master宕机或重启维护堆应用无影响
在磁盘配置为RAID10时,消息也不会丢失
性能最高
缺点:单台宕机期间,这台机器未被消费的消息在机器恢复前不可订阅,消息实时性会受到影响
多master多slave模式 异步复制
丢失消息少
实时性不受影响
缺点:Master宕机,磁盘损坏情况,会丢失少量信息
多master多slave模式 同步双写
数据与服务都无单点,master宕机情况下,消息无延迟,服务可用性和数据可用性都非常高
缺点:性能比异步复制模式略低
主宕机后,备机不能自动切换为主机
分布式事务解决方案
业务与消息耦合
业务消息和消息数据存放在同一个库里
解耦
事务提交之前,先发送消息
数据库事务提交后,才发送消息
需要另外一个步骤去定时确认未确认或取消的消息
消费customer
消费确认
At least Once
消费重复
业务保证幂等
回溯消费
精确到毫秒,可以向前和向后回溯
pushCustomer
监听消息
pullCustomer
主动拉取
生产producer
0 条评论
下一页