Java JVM(Hotspot)
2019-01-18 20:48:29 0 举报
AI智能生成
Java JVM
作者其他创作
大纲/内容
JVM内存区域
运行时数据区域
数据区
堆
按分代划分
新生代
老年代
从内存分配的角度划分
TLAB(Thread Local Allocation Buffer)
OutOfMemoryError
方法区
加载的类信息
常量池
静态变量
即时编译器编译后的代码-动态代理,匿名内部类
HotSpot里面的实现是永久带,正在往hava heap和native memory中转移,1.7后的字符串常量池移到堆里面了,永久带在1.8被移除了
OutOfMemoryError
运行时常量池(Runtime Constant Pool)
和Class的常量池对比(Constant Pool Table)
文章
好文
溢出问题
String.intern
CGLib
动态语言持续创建类
JSP文件被编译成类
OSGi应用,不同的类加载器加载了大量的类
命令区
Java虚拟机栈
什么是栈帧-栈针溢出
StackOverflowError
单线程情况下都抛出这个错误
无线递归导致
虚拟机栈可以动态扩展,抛出OutOfMemoryError
这个只有在并发多线程的时候才会出现
局部变量表
操作数栈
动态连接
方法返回地址
线程私有,生命周期与线程相同
本地方法栈
虚拟机规范没有强制规定
hotspot和虚拟机栈合二为一
程序计数器
线程私有
直接内存
OutOfMemoryError
缓冲区/NIO
-XX: MaxDirectMemorySize指定,默认与Java堆最大值(-Xmx指定)一样
对象探秘
new
流程
虚拟机指令
对象分配内存
指针碰撞(Bump the Pointer)
内存规整
使用Serial, ParNew等带Compact过程的收集器使用
空闲列表(Free List)
内存不规整
CMS这种Mark-Sweep算法的收集器使用
分配内存时线程导致并发冲突
加锁
CAS配上失败重试的方式
TLAB(Thread Local Allocation Buffer)
-XX: +/-UseTLAB启用
invokespecial
invokespecial只能调用三类方法:<init>方法;private方法;super.method()。因为这三类方法的调用对象在编译时就可以确定。
invokevirtual
对象的内存布局
对象头(Header)
Mark Word(运行时数据)
哈希码(HashCode)
GC 分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
对象分代年龄
类型指针
实例数据(Instance Data)
对其填充(Padding)
对象的访问定位
句柄
堆中需要维护句柄池
直接指针
HotSpot使用这种,对象头里面放这个指针
OOM
堆OOM
虚拟机栈/本地方法栈OOM
方法区和运行时常量池OOM
直接内存OOM
程序编译与代码优化
早期(编译器)优化
泛型处理
自动装箱,拆箱
晚期(运行期)优化
JIT-热点代码
JVM命令与工具
jsp-虚拟机进程状况工具
jstat-虚拟机统计信息监视工具
jinfo-Java配置信息工具
jmap-Java内存映像工具
jhat-虚拟机dump快照分析工具
jstack-Java堆栈跟踪工具
HSDIS-JIT生成代码反汇编
JConsole-Java监视与管理控制台
VisualVM-多合一故障处理工具
JMX
文一
文二
调优案例分析与实战
TODO
文一
文二
虚拟机执行子系统
类文件结构
类加载机制
字节码执行引擎
案例与实战
高效并发
Java内存模型与线程
硬件的效率与一致性
CPU缓存一致性
缓存一致性协议
MSI/MESI/MOSI/Synapse/Firefly/Dragon Protocal
伪共享问题
缓存行
缓存行填充
内存模型
Main Memory(主内存)
所有的变量都存储在主内存,类比电脑主内存
Thread Working Memory(线程工作内存)
类比处理器高速缓存
内存间交互操作
lock(锁定)
作用于主内存的变量, 它把一个变量标识为一条线程独占的状态
unlock(解锁)
作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read(读取)
作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存,以便随后的load动作使用。
load(载入)
作用于工作内存的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用)
作用于工作内存的变量,把工作内存中一个变量的值传递给执行引擎。
assign(赋值)
作用于工作内存的变量,把执行引擎接收到的值赋给工作内存的变量。
store(存储)
作用于工作内存的变量,把工作内存中一个变量的值传送给主内存中,以便随后的write操作使用。
write(写入)
作用于主内存的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中。
操作规定
volatile的特殊规定
保证内存可见性
禁止指令重排序
DCL单例模式需要使用volatile
原理相当于加了内存屏障
内存屏障Memory Barrier
long和double的特殊规则
并发特征
原子性
synchronized关键字
monitorenter
monitorexit
可见性
synchronized
final
要避免this引用逃逸
有序性
synchronized/volatile
happens-before
程序次序规则(Program Order Rule)
管程锁定规则(Monitor Lock Rule)
volatile变量规则(Volatile Variable Rule)
线程启动规则(Thread Start Rule)
线程终止规则(Thread Termination Rule)
线程中断规则(Thread Interruption Rule)
对象终结规则(Finalizer Rule)
传递性(Transitivity)
Java与线程
线程的实现
使用内核线程实现
内核线程的高级接口-轻量级进程
用户线程
实现复杂,已经放弃
用户线程家轻量级进程混合实现
Java线程的实现
Windows
Linux
Solaris
Java线程调度
协同式线程调度(Cooperative Threads-Scheduling)
抢占式线程调度(Preemptive Threads-Scheduling)
线程状态
新建(New)
运行(Runable)
包括了操作系统线程状态中的Running和Ready
无限期等待(Waiting)
没有设置Timeout参数的Object.wait()方法
没有设置Timeout参数的Thread.join()方法
LockSupport.park()方法
限期等待(Timed Waiting)
Thread.sleep()
设置了Timeout的Object.wait()
设置了Timeout的Thread.join()
LockSupport.parkNanos()
LockSupport.parkUntil()
阻塞(Blocked)
阻塞状态与等待状态的区别
结束(Terminated)
线程安全与锁优化
线程安全
不可变(Immutable)
绝对线程安全
相对线程安全
线程兼容
线程对立
线程安全的实现方法
互斥同步
synchronized
lock
等待可中断
可实现公平锁,默认是非公平锁
锁绑定多个条件,R额entrantLock对象可以同事绑定多个Condition对象
非阻塞同步
CAS
ABA问题
无同步方案
可重入代码(Reentrant Code)
线程本地存储(Thread Local Storage)
锁优化
自旋锁与自适应自旋
锁消除
锁粗化
轻量级锁
偏向锁
热部署(hotswap)
OSGI
CGLIB,ASM动态修改字节码
自己实现classloader
0 条评论
下一页