Java高级工程师学习知识点
2021-05-26 13:39:05 47 举报
AI智能生成
喜欢就点赞吧,不喜勿喷
作者其他创作
大纲/内容
框架
spring
AOP和IOC
IOC
beanfactory,在用到的时候加载到concurrenthashmap中,如果对象需要其他依赖,会递归实现里面的依赖。applicationcontext就是在容器加载的时候就把全部的bean放到concurrenthashmap中了
AOP
切面编程,一般是将可复用的方法在切点前后执行,实现方式有aspectj(静态织入),cglib和jdk动态代理
动态代理的实现方式
cglib
利用asm框架,把代理对象的class文件加载进来之后修改其字节码生成子类。
jdk
利用反射机制生成一个实现代理接口的匿名类
bean的创建流程
1.获取bean的名字
2.从缓存中查询是否有这个bean
3.没有的话就需要通过反射创建bean的实例(注意此时bean为空,里面东西都没注入)
4.标记这个bean已经被创建了(此时可能会有循环依赖的问题,Spring用三级缓存来解决,提前将bean曝光)
5.递归获取依赖的其他的bean
6.给当前bean绑定属性
springmvc
工作原理
执行流程
springboot
@SpringBootApplication注解的组成
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
优点<br>
自动配置原理
netty
webservice
微服务
dubbo
角色
Provider<br>
暴露服务的服务是提供者<br>
Consumer<br>
调用远程服务的是消费者<br>
Registry<br>
服务注册与发现的注册中心<br>
Monitor<br>
统计服务的调用次数和调用时间的监控中心<br>
Container<br>
服务运行容器<br>
限流
原理<br>
面试题
面试题
springCloud
消息队列<br>
特点
解耦<br>
异步
削峰<br>
ActiveMQ
RabbitMQ
Kafka
RocketMQ
原理
springboot整合RocketMQ
角色
生产者producer<br>
负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息。
消费者consumer<br>
负责消费消息,消费者从消息服务器拉取信息并将其输入用户应用程序。
名称服务器Name Server
Name Server 为 producer 和 consumer 提供路由信息。<br>用来保存 Broker 相关 Topic 等元信息并给 Producer ,提供 Consumer 查找 Broker 信息。
消息服务器Broker
是消息存储中心,主要作用是接收来自 Producer 的消息并存储, Consumer 从这里取得消息。<br>
执行流程<br>
1、启动 Namesrv,Namesrv起 来后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。<br><br>2、Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包。<br><br>3、收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在 哪些 Broker上。也可以在发送消息时自动创建Topic。<br><br>4、Producer 发送消息。<br><br>5、Consumer 消费消息。
数据不丢失
另一篇文章
redis
Linux
线上频繁full gc怎么办,CPU使用率过高怎么办<br>
工程篇
zookeeper
作用
配置管理
代码demo
命名服务
分布式锁
集群管理
存储结构
节点类型
PERSISTENT 持久化节点
PERSISTENT_SEQUENTIAL 持久顺序节点
EPHEMERAL 临时节点
EPHEMERAL_SEQUENTIAL 临时自动编号节点
部署
单机
目录结构
配置 Zookeeper
集群
其他
CAP原则
C:一致性(读操作总能读到以前的写操作)<br>
A:可用性(在单台机器出错时,仍然能正常工作,不用迁移到其他机器)<br>
P:分区容错性(异常情况下仍能满足CA)<br>
总结:该理论指出一个分布式系统不能同时满足CAP。因为P是必须的,Zookeeper保证了CP,A的话在leader选举的时候会丢失部分请求<br>
ZAB协议
消息广播:半数follower收到请求即commit
崩溃恢复:leader崩溃后选举leader的过程
Leader选举算法和流程
每个ZooKeeper都有两个Id,一个是代表自己的serverid,一个是代表本身所存储的数据的Zid,<br>一开始还没有leader也没有数据的时候会选举最大的serverid当leader<br>当运行突然崩溃时,先每个都选举自己,广播自己的serverid和Zid,然后收到的机器广播最大的那个Zid对应的Pid,当半数+1ZooKeeper同意的时候即成为Leader<br>
nacos
部署
maven
高并发
多线程
创建线程的方式及实现<br>
继承Thread类创建线程类
实现Runnable接口创建线程类
实现Callable接口配合Future创建线程
线程池
为什么用线程池?
减少开销,方便管理
ThreadPoolExecutor的工作流程
来一个先到核心线程,核心线程满了到消息队列,消息队列满了最大线程还没满,就建非核心线程工作
fixedThreadPool() 启动固定线程数的线程池
CachedThreadPool() 按需分配的线程池
ScheduledThreadPoolExecutor() 定时,定期执行任务的线程池
ThreadPoolExecutor() 指定线程数的线程池
sleep()、wait()、yield()、join()的区别<br>
线程的生命周期及安全问题<br>
ThreadLocal原理及内存泄漏<br>
并发工具类使用详解及CountDownLatch、CyclicBarrier、Semaphore、Exchanger的区别<br>
volatile作用
保证可见性(这里指主内存与工作内存间的可见性)
防止指令重排(指令重排也会导致可见性问题)
volitale和synchronized的实现原理<br>
sysnchronized和Lock的区别<br>
CAS乐观锁,ABA问题<br>
乐观锁的业务场景及实现方式<br>
网络编程
网络架构模型
OSI参考模型
应用层
表示层
会话层
传输层<br>
网络层
数据链路层
物理层<br>
TCP/IP模型<br>
应用层
应用层
表示层
会话层<br>
传输层
TCP/UDP
网络层
数据链路层
物理层
socket网络编程
TCP
是可靠地面向连接的通信过程,含有三次握手四次挥手的机制
UDP
是不可靠的无连接的通信过程,客户端只管发,不管服务端有没有接受到
TCP和Http的区别
源码
JDK1.8 ConcurrentHashMap
put操作<br>
1、判断key和value是否为null
2、得到key的hash值
3、开启一个无限循环,保证数据一定会保存进去
4、判断,table是否为空,为空则进行初始化操作<br>initTable()
5、判断,table不为空,bucket为空,则直接使用CAS操作,将Node放入到对应的bucket中<br>
6、判断,若当前Node处于MOVED,则表示当前Map正在扩容,先协助扩容,再更新值
7、判断的else部分,表示存在hash冲突,使用synchronized锁住当前node,进行进一步判断
1、判断,节点已经存在,则修改链表节点的值<br>
2、判断,节点不存在,则添加值链表尾部
3、判断,是否为红黑树,若是,则添加节点到红黑树
8、判断,链表节点是大于等于8,若超过了,则将链表转化为红黑树
9、统计节点个数,检查是否需要resize
get操作
1、得到key的hash值
2、判断,table是否为空,为空则直接返回null
3、不为空,则根据hash值找到对应的bucket
4、判断,是否是想要的node,是则返回值,否则返回null<br>
Java基础<br>
面向对象的特征<br>
继承
封装
多态
重写<br>
重写的规则<br>
重载 <br>
重载的规则<br>
抽象
基本数据类型<br>
byte
char<br>
short
int
long
float<br>
double
boolean
修饰符访问权限
final、finally、finalize的区别<br>
int和Integer的区别<br>
抽象类和接口的区别<br>
接口中的方法会被隐式的指定为 public abstract<br>接口中的变量会被隐式的指定为 public static final
反射的用途及实现<br>
说说你对Java反射的理解
深克隆和浅克隆<br>
JDBC流程<br>
equals和==的区别,hashcode和equals的关系<br>
ArrayList、Linkedlist、Vector的区别<br>
HashMap和HashTable的区别<br>
HashMap和ConcurrentHashMap的工作原理及代码实现<br>
String类可以被继承吗<br>
String为什么要设计成不可变的
String、StringBuffer和StringBuilder的区别
简答:String是不可变类;StringBuffer对象则代表一个字符序列可变的字符串;StringBuilder和StringBufffer基本一样,但是线程非安全<br>
数据结构:树、排序算法、查找算法<br>
Exception和Error
Exception可以catch后处理,比如IOexception,出错后程序仍能运行
error是非检查性异常,比如OOM
成员变量和实例变量的区别<br>
内部类
静态内部类的设计意图<br>
时间复杂度<br>
泛型<br>
泛型中extends和super的区别
<? extends Parent> 指定了泛型类型的上届
<? super Child> 指定了泛型类型的下届
<?> 指定了没有限制的泛型类型
泛型类
泛型接口
泛型方法
进程和线程的区别
序列化的方式
静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?<br>
父类的静态属性和方法可以被子类继承
不可以被子类重写:当父类的引用指向子类时,使用对象调用静态方法或者静态变量,是调用的父类中的方法或者变量。并没有被子类改写。
原因:<br>因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。<br>子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说。<br>
闭包和局部内部类的区别<br>
string 转换成 integer的方式及原理<br>
集合详解<br>
排序
IO流<br>
字节流
InputStrem字节输入流
FileInputStream
BufferedInputStream<br>
OutputStream字节输出流
FileOutputStream
BufferedOutputStream
字符流
Reader字符输入流
InputStreamReader转换流<br>
FileReader
BufferedReader
Writer字符输出流
OutputStreamWriter转换流<br>
FileWriter
BufferedWriter
JDK和JRE的区别
40道java基础面试题<br>
设计模式<br>
代理模式
静态代理
JDK动态代理
Cglib动态代理
单例模式
懒汉式
饿汉式
使用静态内部类
使用枚举
破坏单例模式的方式
反射<br>
克隆
序列化
工厂模式
普通工厂模式
多个工厂方法模式
静态工厂方法模式
抽象工厂模式
策略模式<br>
设计模式
观察者模式
模板模式<br>
JVM内存模型
运行时数据区域(内存模型)
堆
方法区
栈(虚拟机栈)
本地方法栈<br>
程序计数器<br>
垃圾回收机制
强引用:会爆出OOM也不会被回收
软引用:在内存不够的时候被回收
弱引用:每次GC都会被回收(ThreadLocal中内部类Map的key就是)
虚引用:可以用来跟踪GC,对象准备被回收时发现他还有虚引用,会把这个虚引用加入一个引用队列,可以观察这个队列中虚引用是否存在来判断对象是否被回收了。<br>
垃圾回收算法
GCRoots(GCRoots可以简单记忆为,如果被删就一定会影响程序运行的对象,比如有虚拟机栈/本地方法栈中的引用对象,synchronized持有的对象,方法区中的静态对象、常量)
引用计数(redis就是用的这个)
标记清除
标记整理
复制(一般不用在老年代,太耗时,且浪费空间)
分代收集
Minor GC和Full GC触发条件
MinorGC:Eden区满
fullgc:大对象直接 到老年代,老年代空间不足,system.gc,minorgc后发现老年代剩余空间大小小于平均每次从新生代进入老年代的值
JVM调优总结
JAVA类加载机制<br>
JMM<br>
数据库<br>
关系型数据库(SQL)
MySQL
Btree和B+tree算法
详解
一步步分析
in和exists应用场景
数据库索引的原理
另一篇文章<br>
索引使用的注意事项
聚集索引和非聚集索引的区别
另一篇文章<br>
前缀索引<br>
三范式
反三范式
SQL优化
MySQL遇到死锁问题
存储引擎的InnoDB和MyISAM
limit 20000加载很慢怎么解决<br>
另一篇文章<br>
ObjectId规则
倒排索引
事务隔离
事务的基本要素(ACID)
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
数据库读写分离<br>
数据库拆分<br>
横向(水平)<br>
纵向(垂直)
缓存机制
面试题<br>
如何解决事务的并发问题(脏读,幻读)
直接上隔离级别就可解决
读加共享锁,写加排它锁
MVCC多版本并发控制?
Inodb多 维护了两个字段,一个是createversion,一个是deleteversion<br>update时会更新createversion<br>读取到一行需要满足该事务的version大于等于createversion,而小于deleteversion<br>
binlog,redolog,undolog都是什么,起什么作用?
binlog记录的是sql语句
redolog记录是为了保证事务安全,当数据库挂掉之后重启仍能通过redolog执行未完成事务
undolog记录的是上一个版本,用来回滚和快照读
myisam和innodb的区别,什么时候选择myisam?
innodb提供事务,可以崩溃恢复,最低行锁<br>myisam不支持事务,不能崩溃恢复,表锁,<br>读写分离,读库可以选择myisam
为什么选择B+树作为索引结构?
B树非叶子节点也会存,导致b树高度变高,io次数变多,而且叶子节点没有指向下一个叶子节点的指针
索引B+树的叶子节点都可以存哪些东西?
索引值,下一个叶子节点的开头(范围查询的实现)<br>主键索引可以不用再次查询,因为主键索引与数据放在一起。<br>普通索引需要再次查询主键索引之后再得到数据
Mysql为什么不用红黑树?
红黑树每个节点下只有两个子节点,而硬盘IO时是按簇读取的,两个节点中的值可能不够填满簇导致每次IO的浪费,此时红黑树的高度会大于B+树,导致IO次数增加。
Oracle<br>
表空间扩充<br>
非关系型数据库(NoSQL)
Redis<br>
使用场景
缓存
排行榜
计数器
分布式会话
分布式锁<br>
示例<br>
社交网络
最新列表
消息系统<br>
存储类型
String
适合最简单的k-v存储,类似于memcached的存储结构,短信验证码,配置信息等,就用这种类型来存储
hash
一般key为ID或者唯一标示,value对应的就是详情了。如商品详情,个人信息详情,新闻详情等
list
因为list是有序的,比较适合存储一些有序且数据相对固定的数据。如省市区表、字典表等。因为list是有序的,适合根据写入的时间来排序,如:最新的***,消息队列等。
set
可以简单的理解为ID-List的模式,如微博中一个人有哪些好友,set最牛的地方在于,可以对两个set提供交集、并集、差集操作。例如:查找两个人共同的好友等。
zset
是set的增强版本,增加了一个score参数,自动会根据score的值进行排序。比较适合类似于top 10等不根据插入的时间来排序的数据。
为什么redis是单线程的
纯内存访问<br>
单线程避免了线程切换和竟态产生的消耗
非阻塞I/O,使用epoll作为I/O多路复用实现,再加上自身事件处理模型将epoll中的连接、读写、关闭都转化为事件,不在网络I/O上浪费过多时间
redis持久化机制
RDB:把当前进程数据生成的快照保存到硬盘中的过程
触发机制
sava命令:阻塞当前redis服务器,知道完成为止,对内存较大的实例造成长时间的阻塞,线上不建议使用
bgsave命令:redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束
bgsave流程说明<br>
1、执行bgsave命令,Redis父进程判断当前是否存在正在进行的子进程,若存在,bgsave命令直接返回
2、父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞
3、父进程fork完后,bgsave命令返回信息并不再阻塞父进程,可继续响应其他命令
4、子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换
5、子进程发送信号给父进程表示完成,父进程更新统计信息
优缺点
优点<br>
1、RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间节点上的数据快照,适用于备份、全量复制等场景
2、Redis加载RDB恢复数据快于AOF方式
缺点
1、RDB方式数据没办法做到实时持久化/秒级持久化<br>
2、RDB文件使用特定二进制格式保存,Redis版本演变过程中有多个版本的RDB格式,导致无法兼容
AOF:以独立日志方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的
缓存穿透
什么是缓存穿透
解决方案
缓存空对象
布隆过滤器拦截
布隆过滤器
缓存雪崩<br>
什么是缓存雪崩
解决方案
1、保证缓存层高可用
2、依赖隔离组件为后端限流并降级
3、提前演练
4、预热缓存
缓存降级
键过期策略
内存淘汰机制
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
Redis并发竞争key问题
问题举例
多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是顺序变成了4,3,2,最后变成了2。
解决方案
zookeeper的分布式锁实现(监听前面一个节点,当自己为第一个节点时,获得锁)
redis的分布式锁实现(setnx+看门狗(比如当key过期快到的时候还没有delete,自动续时))
消息队列串行执行
Redis与Mysql双写一致性方案
先更新mysql再删除reids能满足大部分需求
直接串行执行
主从+sentinel模式搭建<br>
SSDB
memcached
扩展
图数据库
收藏
0 条评论
下一页