java学习图谱
2019-07-12 10:02:11 75 举报
AI智能生成
java学习图谱
作者其他创作
大纲/内容
分布式
zookeeper
dubbo
分布式事务
NIO
netty
ActiveMQ
Kafka
redis
nginx
分库分表
Docker
jvm
溢出
堆溢出
内存泄漏
通过工具查看GCRoot引用链
内存溢出
检查堆参数
栈溢出(虚拟机栈和本地方法栈)
线程请求深度>Max(StackOverflowError)
VM申请栈空间无法满足(OutOfMemoryError)
方法区和运行时常量池(属于方法区)溢出
动态生成大量类(方法区存放Class相关信息)
本机直接内存溢出
使用了NIO
HeapDump文件很小,无明显异常
原因
排查
工具
JVirtualVM
参数检查
参数调整
类加载机制
类加载的时机
类加载的过程
加载
验证
文件格式验证
保证输入的字节流能正确的解析并存储于方法区之中
元数据验证
对元数据的语义进行校验
字节码验证
对数据流和控制流进行分析
符号引用验证
目的:确保解析动作正常执行
对类自身以外的信息进行校验
-Xverfity:none 参数关闭大部分验证措施
解析
符号引用转化为直接引用
初始化
类加载器
双亲委派模型
类加载器
启动类加载器 Bootstrap class loader
扩展类加载器 Extension class loader
应用程序类加载器AppClass Loader
工作过程:收到类加载请求,委托给父类加载器,无法完成时自己加载
目的
安全性
避免重复加载
准备
破坏双亲委派模型
自定义类加载器
垃圾回收
了解原因
排查内存溢出,内存泄漏
垃圾回收成为瓶颈
对象生命周期
引用计数法
无法解决循环引用
可达性分析算法
从GC Root 起是否可到达对象
引用
强引用
只要强引用存在就不会回收
软引用
二次回收(内存不足时才会回收)
弱引用
生存至下一次GC
虚引用
作用回收对象时通知
回收方法区
废弃常量
无用的类
大量反射,动态代理,CGLib频繁自定义ClassLoader
需要有类卸载功能,保证永久代不会溢出
垃圾收集算法
标记-清除算法
效率和内存碎片问题
复制算法
分区复制回收
适用于对象存活率低的场景(新生代)
标记-整理算法
标记-清楚-整理
适用于对象存活率高的场景(老年代)
分代收集算法
根据对象存活周期分为不同的几块
新生代
复制算法
老年代
标记-清理或标记-整理算法
组成
类加载器
执行引擎
运行数据区
线程私有
PC计数器
Java虚拟机栈
本地方法栈
线程共享
Java堆
新生代Young Genneration
Eden Space
S0 Survivor Space
S1 Survivor Space
旧生代Old Generation/tenured
Perm 存放运行时数据区的方法区
方法区
类结构信息
运行时常量
java基础
接口及抽象类
序列化
Serializable
网络编程
NIO
基本概念
同步异步
关注事件发生时的行为
阻塞非阻塞
关注等待事件时的状态
组件
Channel
FileChannel(文件)
transferFrom()
将数据从源通道传输到FileChannel
transferTo()
将数据从FileChannel传输到其他的channel
DatagramChannel(UDP)
SocketChannel(TCP)
ServerSocketChannel(监听套接字)
Buffer
属性
Position
Limit
Capacity
重要方法
filp:读写模式切换
clear()和compact()的区别
类型
ByteBuffer
DoubleBuffer
MappedByteBuffer(文件零拷贝)
Scatter/Gather
Scatter
一个Channel分散到多个buffer
Gather
多个buffer收集到一个Channel
Selector
SelectionKey(就绪事件集合)
Accept,Connect,Read,Write
Pipe
管道是2个线程之间的单项数据连接
Source(读),Sink(写)
特点
面向缓冲
非阻塞
选择器Selector
AIO
AsynchronousSocketChannel(异步Socket)
AsynchronousChannelGroup(线程组)
监控/控制异步操作
Future
Future.get()
回调CompletionHandler
线程池模拟的(netty4以去除AIO)
IO(BIO)
面向流
阻塞
无Selector
线程及线程池
线程
创建线程
实现Runnable接口
该类可初始化多个线程(资源共享)
继承Thread类
每个Thread类独占资源
实现Callable接口
可以获得返回值
线程池
种类
newFixedThreadPool:固定大小and无边界队列
newWorkStealingPool:工作窃取
newSingleThreadExecutor:单线程and无边界队列
newCachedThreadPool:线程不足时创建
newScheduledThreadPool:定长,支持定时周期执行任务
线程池的实现原理
1.核心线程池是否已满
2.队列是否已满
3.线程池里的线程是否已满
饱和策略处理已满后的任务
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue:支持优先级的无界队列
DelayQueue:支持延时获取元素的无界阻塞队列
缓存系统的设计
定时任务调度
SynchronousQueue:不存储元素的阻塞队列
LinkedTransferQueue
LinkedBlockingDeque:由链表结构组成的双向阻塞队列
反射机制
运行时可自我识别的一种技术
作用
获取类型的相关信息
动态调用方法
动态构造对象
从程序集中获得类型
设计模式
单例
确保一个类只有一个实例
实现
多线程Synchronize
双重检查锁
静态内部类
枚举
原型
“复制”一个已经存在的实例来返回新的实例
使用场景
对象类型不是开始就能确定的
对象状态已改变,不能通过new来得到当前对象的clone
相当于c++拷贝构造函数
动态代理
代理类不变,动态更换被代理类
静态代理:每代理一个类都要写很多类似的新类,如日志,缓存
spring
IOC
不创建对象,但描述创建它们的方式
AOP
将影响多个类的行为封装到可重用的模块中
DAO
优点:屏蔽存储介质和实现
特点
完备的异常体系
统一数据访问模板
iBatis:SqlMapClientTemplate
Hibernate:HibernateTemplate
JDBC:JdbcTemplate
多种数据源支持
DBCP
C3P0
Spring事务管理
标准事务
编程式事务(模板事务)
TransactionTemplate
声明式事务(AOP实现)
在IOC配置中指定事务边界和属性
区别及运行原理
事务的传播机制
数据库
锁
乐观锁
认为数据一般情况下不会造成冲突
MVCC(多版本并发控制)
优点:并发性好效率高
缺点:不能保证数据绝对安全
实现原理:版本号
悲观锁
认为数据很大可能产生冲突
优点:保证数据安全
缺点:并行度差效率低
实现原理:一般依靠数据库提供的锁(行锁,表锁)
索引
联合索引(符合索引)
多字段组成的索引
优点
快速筛选数据
可利用覆盖索引
sql执行计划
通过工具分析(如MySQL EXPLAIN)
0 条评论
下一页