java 基础
2021-02-22 16:07:10 101 举报
AI智能生成
123
作者其他创作
大纲/内容
java并发
volatile
可见性
mesi缓存一致性协议
指令重排序
系统底层实现
系统底层的内存屏障 sfence,mfence
锁总线 锁定总线中的部分
jvm的内存屏障,hotspot使用的是锁总线 最终使用的是lock指令 lock指令具有可移植性
DCL double-check-lock 单例模式
不保证原子性
强软弱虚
强引用
软引用
内存不够时回收,多用于缓存
弱引用
threadlocal中的节点
spring中的事务注解
原理
虚引用
管理堆外内存
nio--netty中的zerocopy
jdk nio
线程池
线程池参数
核心线程数
最大线程数
keepalivetime
时间单位
工作队列
线程工厂
Worker
拒绝策略
四种默认线程池
自定义线程池
unsafe类
直接操作类实例
直接分配释放内存
锁 lock
程序出现异常,锁会被释放,
可重入锁 reentrantlock
读写锁 readWriteLock
lockSupport
park
unpark(thread)
wait和notify notifyall
condition
按条件唤醒线程
本质就是不同的等待队列
AQS
volatile state
cas 方法
线程终止方法
stop() 禁用
interrupt 需要在线程里捕获异常
正常结束 推荐,循环条件问题
对象内存分布问题
对象头
markword 8byte hashcode
synchronized 升级过程
偏向锁 epoch与批量撤销偏向锁有关, 关闭偏向锁时间延迟 -xx:blaselocaltimedelay
轻量级锁 自旋次数设置--XX:PreBlockSpin,等待线程超过cpu一半就升级
重量级锁
依赖操作系统内核mutex,每一个锁下面都挂一个队列,从队列中依次获取锁
锁消除
锁粗化
指针类型 4byte
实例数据 根据对象决定
padding补齐被8整除
线程
线程状态
new
start
runabled
running
ready
termined
线程状态之间的转变
atomic
cas--compare and swap
cas的ABA问题,增加时间戳或者版本号
自旋消耗内存问题
同步执行
多变量共享问题
封装成一个对象
同步synchronization
底层指令 lock cmpxchg
AQS
同步队列,内部维护了一个volatile修饰的state,和cas的同步队列,lock的实现都是基于AQS实现
扩展
countDownLaunch
cyclicBarrier
Phaser
semaphore
exchange
基础
重写hashcode和equals
当我们需要重新定义两个对象是否相等的条件时,需要进行重写。比如通常情况下,我们认为两个不同对象的某些属性值相同时,<br>* 就认为这两个对象是相同的。<br>* 例如:我们在HashMap中添加元素时,我们认为当key相同时,两个元素就相同,但是默认的Object中的equals(),只是单纯的比较两个元素 的内存地址是否相同,不能满足我们的要求,所以需要重写。<br>* 2.当我们自定义一个类时,想要把它的实例保存在集合时,就需要重写equals()和hashCode()方法
tcp 通信基础
internet分层
osi七层模型
应用层
表示层
会话层
传输层
网络层
数据链路层
硬件层
tcp/ip 五层
应用层
传输控制层
tcp
面向连接的,可靠的传输协议
socket
udp
网络层
ip
寻址ip
ipaddr 主机地址
netmark网络号
数据链路层
mark地址
物理硬件层
同步IO模型
BIO
每个连接对应每个线程调度开销和资源耗费严重
路由 route
决定是否要通过网关去访问,
优势,多线程去处理连接很少的情况,效率很高
NIO
一个非阻塞线程 对应多个连接
缺点,连接处理可能不及时,空循环
多路复用器
select poll
epoll
nginx
redis
集合框架问题
collection
list
arrayList
LinkedList
Vector
set
hashset
treeSet
map
abstractMap
hashmap
LinkedHashMap
treemap
ConcurrentHashMap
加锁算法
hashtable
迭代器
快速失败和安全失败
queue
poll和remove
Collections
Arrays
JVM
运行时数据区
程序计数器
栈
栈帧
局部变量表
操作数栈
动态链接
方法返回地址
堆
方法区
运行时常量池
本地方法栈
直接内存
对象内存分配过程
垃圾回收机制
是否可以回收
可达性分析
引用计数 ,循环引用无法解决,
垃圾回收算法
标记 清除
标记 清除 整理
复制算法
分代收集算法
垃圾回收器
分代收集
新生代
serial new 串行回收器
parnew 多线程回收器时间优先
Parallel scavenge 需要牺牲时间来提高吞吐量
老年代
CMS 垃圾回收器, 老年代回收,配合serial old使用
serial old
Parallel scavenge 需要牺牲时间来提高吞吐量
分区收集
G1 垃圾回收
类加载过程
双亲委派模型
加载过程
虚拟机监控与优化
jps
jinfo
jmap
jmap -histo
查看当前类有多少对象
jmap-heap
查看当前堆信息
jmap -dump:live,format=b,file=dump.hprof JPID
打印当前堆快照信息
生产环境配置heaponoutofmemoryError 参数,当发生异常时,就打印堆快照信息
摘掉一台服务器,然后模拟流量操作,进行监控分析
jstack
jconsole
jvisualvm
不可以直接连接,多连接就要多开端口,不安全
会通过jmap打印堆信息,分析
调优参数
虚拟机调优
arthas
dashboard
查看线程,堆栈,运行版本
thread
-b
查看是否死锁
id
分析线程
jad
对某个类进行反编译
redefine
修改一个类之后,重新编译,热替换
trace ABC method
追踪一个方法的执行时间
链路追踪
cpu爆满
死循环问题
sql脚本有误,营业部和人员之间出现死循环,然后这个营业部的人员登陆后执行查询就cpu占满,一直超时
解决,NGINX直接打向本地,打断点调试。
jvm假死
java -version
Java -X
稳定参数
Java -XX
不稳定参数
700多个参数
调优手段
预分配内存
堆栈分配情况
选择合适的垃圾回收器
jdk8 默认 parallel
卡顿问题
加大内存
换垃圾收集器
oom
top指令
top -H -p pid
printf "%x\n" 17880
45d8
45d8
jstack 17850|grep 45d8 -A 30
full-gc
1 system.GC
2 堆空间不足
3 方法区空间不足
虚拟机优化
1 栈上分配
逃逸分析
分析对象的生命周期
标量替换
用基本类型来替换对象
虚拟机启动参数
0 条评论
下一页