JVM全家桶
2019-11-27 11:28:40 3 举报
JVM 全面的结构图、领悟了这几张图就可以放弃JVM了
作者其他创作
大纲/内容
对象Z(1)
执行引擎
单线程
CPU0
Execution Engine
有序性
Metaspace(JDK1.8)-XX:MetaspaceSize
用户线程1
年轻代/新生代Yong Generation
Serial Old
线程终止规则
当前栈帧
方法返回地址
-XX:SurvivorRatio = Eden/survivor
对象B(3)
最终标记
本地方法库
G1
标记-整理-清除
动态链接
-serve
收集器
线程隔离的数据区域
Object 2
2:整理(Compact) 再次扫描、并往一端滑动存活的对象
当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使 用Runtime类或者System.exit()来退出。
GC线程
safePoint
解析执行
.Java文件
Class 文件
CMS
……
34
14
筛选回收
CPU1
重排序
本地接口
偏向锁
Thread2
常见
T2 计数器
-Xmx
局部变量
Bea JRockit
public void helloWord { A a = new A () ;}
Eden
程序计数器(Program Counter Register)
由所有线程共享的数据区域
Java 堆
8大原则
让MarkWork指向Montor监视器
13
方法区
栈结构
编译
栈帧2
start
MESI
标记-复制-清除
类加载器Class Loader
JDK开发工具包JAVAc、jar等
IBM J9
获取或更新计数器操作字节码
静态变量
Lock指令
使用最广泛的jvm,兼 容性好,开源,无论使 用于客户端或者服务端 都有较好的性能,综合 性能比较优秀
不需要额外空间
可见性
a+b=c
对象:Object数组:Array
-XX:MaxPermSize
重新标记
栈帧1
38
老年代采用标记整理暂停所有用户线程
Heap
Serial
CPU2
40
可组合上面所有规则,实现可见性
24
年轻代/新生代(1/3)
栈帧3
直接执行
JRE运行环境
Survivor 1
可见
线程中断规则
36
JVM实例的消亡
线程启动规则
原子性
流水线作业
ParNew
37
程序计数器
Container
33
Sun HotSpot
Object 7
与HostSpot定位比较接近, 主要使用于IBM公司各种 JAVA产品的执行平台, 例如IBM WebSphere以及 在IBM AIX和z/OS这些平 台上部署的JAVA应用。
19
通过本地或网络传输字节码
老年代(2/3)
可达性分析算法
9
32
1: 标记清楚2:复制(标记-复制-清除)3:标记整理(标记-整理-清除)4:分代回收
25
堆(Heap) 空间
程序计数器使用模拟
intel操作手册
S1 区
让MarkWork指向线程栈帧的锁记录
通过持有线程ID实现
8
JVM
放大结构
Object 1
30
2:清除(Sweep) 扫描整个内存空间、回收未被标记的对象、使用free-list记录可用的区域
26
JVAV源程序
方法区(Method Area )
JAVA的各种集成开发工具Eclipse、NetBean、IntelliJ IDEA等
并发标记
Volatile
内存回收系统
运行常量池类:Class静态变量
重置线程
重量锁
传递性
Linux下的 JAVA字节码 解释程序
有序
3
JVM实例的诞生
22
Paralle Scanvenge
35
Java内存模型
操作数栈
10
T1 计数器
MESI原子、缓存处理器的嗅探
伊甸区
即时编译器编译后的代码
VM Stack
Thread1
Object 4
老年代Tenured Generation
17
GC Roots
本地方法接口(JNI)
类加载
CPU
阻塞无自旋
Tenured
1: 从根集合(GC Root)开始、通过Tracing从From找到存活的对象、拷贝到To中2: From 、To 交换身份、下次内存分配从To开始
31
连续的空闲内存区域
永久代
23
当启动一个JAVA程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
运行时数据区
1:标记(Mark) 与标记-清除一样
没有内存碎片、可以利用的bitmap-the-pointer
对象C(0)
Parmanent
1/8
运行时数据区(Runtime Data Area)
堆空间Heap Space
-Xms
39
线程私有
16
* 需要付出移动对象的成本
方法去(Method Area)
执行效率最优秀的JVM, 专注为服务器硬件和服 务端应用场景高度优化 的虚拟机,但启动慢, 占内存,通常使用于 Bea 的中间件产品 WebLogic上。
Linux操作系统
5
虚拟机栈
管理锁定规则
Object 3
CAS
Object 6
Native Method Stack
From
Native Interface
本地机器指令
Java栈(VM statck)
线程相关
本地方法栈
Windows操作系统
7
堆
内存屏障
Windows下 的JAVA字节 码解释程序
Object 5
18
To
线程共享
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部 有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由 JVM自己使用,JAVA程序也可以标明自己创建的线程是守护线程。
需要双倍内存空间
Sysnchronized
Survivor 0
* 两次扫描、耗时严重* 会产生 内存碎片
能直接解释 JAVA字节码 的CPU
新生代采用复制算法暂停所有用户线程
初始标记
Paralle Old
1: 引用计数2:根结点可达(根搜索,可达性分析)
S0 区
1:没有标记和清除的过程、效率高2:没有内存碎片、可以利用bitmap-the-potienr实现快速的内存分配
堆(Heap)
21
final
轻量锁
JVAV字节码(.class 文件)
程序测序规则
局部变量操作栈动态链接方法出口
15
29
字节码指令
6/8
并发清理
直接内存(Direct memory)
CPU内存模型
happen-before
缓存一致性协议和内存栏栅
Program Counter Register
本地方法栈(native Method Statck)
对象A(1)
锁
finalize
4
11
线程轮换执行,某一刻只执行一个
JVM虚拟机
end
GC收集算法
GC收集器
无效Cache
JVM实例的运行
12
Mark word
1
27
等……
JIT优化
GC判断策略
-XX:NewRatio = Old/yong
young Generation
2
Method Area
构造函数
20
28
JVM 内存结构
1:标记(Mark) 从根节点开始扫描、对存活的对象进行标记
tenured Generation
.Class字节
自选无阻塞
类信息
Free Pointer
类装载子系统(classload)
程序相关
OS操作系统
常量
Native Libraries
GC引用计数
6
原子
0 条评论
下一页