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