Java程序员知识树
2021-04-05 14:22:58 0 举报
AI智能生成
Java程序员必备技能的知识结构树
作者其他创作
大纲/内容
数学
操作系统
组原
数据结构
计算机网络
网络模型
OSI
五层模型
应用层
传输层
网络层
链路层
物理层
编译原理
数据库
事务
特性 ACID
原子性
一致性
隔离性
持久性
隔离级别
未提交读
提交读
可重复读
串行化
编程语言
Java
Java基础
面向对象的特性
封装
继承
多态
集合
IO
J2EE
由一整套服务(services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持
JDBC
JNDI
EJB
JSP
Java Servlet
RMI/IIOP
Java IDL/CORBA
XML
JavaMail
JAF
JMS
JTA
JTS
多线程、并发
并发编程基础
线程的创建方式
继承Thread
实现Runable
FutureTask
线程池
线程的通知与等待
wait/notify
线程睡眠
yield方法
线程中断
线程上下文切换
线程死锁
死锁产生的条件
互斥条件
请求并持有条件
不可剥夺条件
环路等待条件
避免死锁
破坏“请求并持有”、“环路等待”条件
具体做法
多线程获取资源的顺序保持一致
守护线程和用户线程
ThreadLocal
并发编程
并发和并行
线程安全问题
共享变量同时被多个线程修改时导致的数据不一致问题
Java线程的内存模型(JMM)
主内存和工作内存
并发过程需要考虑的问题
原子性
可见性
有序性
共享变量的内存可见性问题
Java内存模型中的主内存和工作内存
synchronized内存语义
块内使用到的变量从线程的工作内存中清除,每次使用都从主内存中获取,退出时将变量修改刷新到主内存
volatile的内存语义
线程在修改共享变量时不进行缓存,直接刷新到主内存,获取时也直接从主内存中读取,不使用工作内存中的值
提供了可见效保证,但无法保证操作的原子性
操作的原子性
一系列操作要么全部执行,要么都不执行
如何保证
synchronized
CAS
Unsafe类
指令重排
编译器和处理器会对指令重排序以提高运行性能(只会对不存在数据依赖性的指令重排序)
volatile修饰变量不会被重排
伪共享
缓存一致原则
缓存行中有多个变量时,由于同时只能有一个线程操作缓存行,所以相比将每个变量都放到一个缓存行中,性能会下降
如何避免伪共享
jdk8之前通过字节填充
jdk8提供了Contended注解
只用于rt下的核心类,如何用户类路径想使用,需添加JVM参数 -XX:-RestrictContended
填充宽度默认为128
自定义填充宽度 -XX:ContendedPaddingWidth
锁
锁类型
乐观锁和悲观锁
公平锁和非公平锁
独占锁和共享锁
可重入锁
自旋锁
用户状态和内核状态及相互之间的切换
JVM默认自旋次数为10,可通过-XX:PreBlockSpinsh进行修改
Java中的锁机制
synchronized
锁粗化
将多个连续加锁、解锁的操作连接到一起,扩展成一个范围更大的锁,避免频繁加锁解锁带来的性能消耗
锁消除
锁升级
无锁
偏向锁
可重入锁
轻量级锁
自旋锁
避免持有锁时间不长的场景下,阻塞线程CPU从用户态切换到内核态的消耗
重量级锁
互斥锁
lock
JUC
AQS
atomic
ForkJoin
JVM
自动内存管理
内存区域
方法区
存储已被加载的类型信息、常量、静态变量、代码缓存等数据
永久代&元数据空间 -XXMaxPermSize
运行时常量池
堆
存储所有的对象实例和数据
-Xmx 最大值 -Xms初始值
对象在堆中的内存布局
对象头
存储对象自身运行时数据:哈希码、GC分代年龄、锁状态标识、线程持有的锁,偏向线程ID、偏向时间戳等
实例数据
对象填充
对象大小必须是8的倍数,不足填充
对象的访问定位
句柄
直接指针
虚拟机栈
栈帧
局部变量表
基础数据类型
引用类型
returnAddress类型
操作数栈
动态连接
方法出口
本地方法栈
程序计数器
垃圾收集器与内存分配策略
垃圾回收面对的问题
哪些内存需要回收
引用计数法
无法解决对象相互引用的问题
可达性分析算法
GC Roots
虚拟机栈中引用的对象
方法区类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
虚拟机自身的引用
被同步锁持有的对象
引用类型
强引用
软引用
弱引用
虚引用
什么时候回收
怎么回收
垃圾收集算法
分代收集理论
分代假说
弱分代
大多数对象朝生夕灭
强分代
逃过越多次数回收的对象越难以被消灭
堆区区域划分
新生代 Minor GC
Eden区
Survivor区
老年代 Major GC
收集算法
标记-清除算法
会导致空间碎片
标记-复制算法
空间浪费严重
标记-整理算法
垃圾回收器
经典收集器
Serial收集器
ParNew收集器
Parallel Scavenge收集器
Serial Old收集器
Parallel Old收集器
CMS
Garbage First(G1)
低延迟垃圾收集器
Shenandoah
ZGC
其他
Epsilon
虚拟机性能监控及故障处理工具
jps
查看虚拟机进程状态
jstat
虚拟机统计信息监视工具
jinfo
JVM配置信息查看
jmap
导出JVM内存映像
jhat
虚拟机堆转储快照分析工具
jstack
JVM堆栈跟踪工具
JHSDB
基于服务性代理的调式工具
JConsole
JVM监视与管理控制台
VisualVM
多合一故障处理
Java Mission Control
可持续在线监控工具
MemoryAnalyzer
Eclipse提供的dump分析工具
调优措施
虚拟机执行子系统
类文件结构
类加载机制
字节码执行引擎
程序编译及优化
JIT(Java即时编译)
逃逸分析
分析对象的使用范围,如果对象不对被其他线程用到,即没有发生逃逸
逃逸分析是方法级别的
结果优化
未逃逸的对象由堆分配转为栈分配,降低垃圾回收的压力
锁消除
分离对象或标量替换
标量和聚合量
标量指基础类型或对象的引用
聚合量指对象,可以进一步分离成标量
将对象的成员变量分解成分离的变量就是标量替换
一个对象如果未发送逃逸,则不需要创建它,只需要在栈或者寄存器上创建用到的成员标量,从而可以达到节省内存空间和提升程序性能的目的
常用框架/组件
Netty
IO模型
BIO
同步阻塞
NIO
同步非阻塞
AIO(NIO2)
异步非阻塞
Reactor线程模型
单线程
所有的IO操作都通过一个线程处理
多线程
主从多线程
tomcat
Spring
IOC
AOP
SpringMVC
MyBatis
拦截器
Signature
type
Executor
method
args
SpringBoot
自动配置
EnableAutoConfigration
spring.factories
SpringCloud
中间件
数据存储
MySQL
索引
聚集与非聚集
B+Tree
存储引擎
MyISIM
InoDb
解释计划
语法
EXPLAIN + sql
作用
表的读取顺序
数据读取的操作类型
哪些索引被使用了
执行计划包含的信息
id
id越大优先级越高,越先执行
select_type
simple
primary
subquery
derived
union
union result
table
type
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery> range > index>all
锁
select ... for update
Redis
Jedis
Redisson
分布式锁
持久化机制
AOF
记录所有的操作指令
存在无用的过程化操作(可以通过达到一定体积后rewrite操作去清理)
RDB
快照
会存在数据丢失
RDB/AOF混合模式
4.x版本后提供,在RDB快照备份后,同时记录快照之后的操作(AOF)
数据库与缓存保持双写一致性
延迟双删
缓存雪崩
大量缓存同一时间失效,导致数据库压力激增
规避措施
缓存失效时间尽量不一致
通过集群持久化等措施保证中间件的可用性,使宕机后可以尽快恢复
缓存穿透
获取缓存的key无法命中缓存和数据库,导致性能下降
规避措施
即使是数据库无法命中也将空数据设置到缓存中,失效时间设置短一点,避免缓存大量无效的key
通过布隆表达式判断key对于的数据是否存在,如果不存在则直接拦截请求,不做处理
消息队列
消息队列的作用
解耦
削峰
异步
消息队列的技术维度
API
发送
接收
高可用性
集群和容错配置
持久化
延时发送/定时发送
签收机制
Spring整合
实现的编程语言-是否便于定制化修改
协议
JMS
组成和特点
Provider
Produce
Consumer
Message
消息头
MessageID
消息体
TextMessage
ObjectMessage
MapMessage
BytesMessage
StreamMessage
消息属性
可靠性
持久性
事务
签收
点对点
发布订阅
AMQP Advanced Message Queuing Protocol(高级消息队列协议)
组成
Message
Producer
Consumer
Virtual Host
Exchange
Queue
死信队列
开源产品
ActiveMQ
传输协议
tcp
nio
amqp
openwire
mqtt
stomp
ws
可靠性
事务
持久
指消息投递
签收
可持久化
应对于mq出问题进行恢复
方式
AMQ Message Store
32M文件形式,5.3之后不可用
KahaDB
db-<num>.log
数据文件
db.data
索引文件
db.redo
恢复文件
lock
多个Broker之间操作文件的锁
LevelDB
带复制功能,5.9版本之后
JDBC
消息存储和持久化
多节点集群
RabbitMQ
Nginx
Docker
设计
RPC
让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单
RPC是一种概念、一种设计,主要解决不同服务间的调用问题
传输协议
HTTP
TCP
序列化协议
常见实现
RMI
Dubbo
gRPC
微服务
网关
请求过滤
请求转发
安全认证
流量控制
负载均衡
容灾
日志
监控
常见实现
Kong
Netflix Zuul
服务治理
请求网关
zuul
spring cloud gateway
信息采集
服务注册于发现
Eureka
Dubbo
Consul
Zookeeper
服务日志
链路跟踪
信息分析
治理策略
Linux
IO模型
select
poll
epoll
用户态和内核态
常用命令
收藏
收藏
0 条评论
下一页