JVM底层原理
2021-08-27 11:59:46 3 举报
JVM底层原理
作者其他创作
大纲/内容
new 类名()
1/10
GC
老年代 Old
CustomClassLoader
CMS
判断对象存活
Java命令执行过程
对象初始化 <init>
对象创建过程
Eden
标记-清除
自定义类加载器
局部变量表
运行时数据区 Runtime Data Area
准备
类加载检查:是否能在方法区常量池定位到类的引用
Young
虚拟机栈 VM Stack
method2
卸载
大对象?
G1
classLoader类加载器
Servivor S0
C++创建一个引导类加载器实例
单线程
URLClassLoader
findClass(String)
拓展类加载器
字符串常量
方法出口
栈
直接
实例数据
KlassPoint
自定义类加载器必须重写findClass方法
堆 Heap
1.对象自身的运行时数据:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时 间戳等。2.类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
Markword
s1
对象
对象头
s0
本地方法接口
对齐填充
JVM
load:加载指定类(二进制)find:直接抛出异常define:byte字节流->class对象resolve:解析
8/10
C++: java.exe调用底层的jvm.dll文件创建java虚拟机
classLoader.loadClass(\"com.mycompany.jvm.类名\")
链接
TLAB
方法区(元空间)MetaSpace
标记-复制Mark-Copying
Major GC
引导类加载器
TLAB(线程私有)
数组
标记-复制
age15
初始化
解析
句柄
本地方法库
栈内分配?(逃逸分析)
parNew
Minor GC
sum.misc.lancher.getLaunCher()
新生代 Young
魔数、版本号、运行时常量池、访问标志、父类引用、接口索引集、字段表、方法表
launcher.getClassLoader()
分配内存
老年代
对象头设置
引用计数法
划分内存:1. 指针碰撞2. 空闲列表解决并发:1. CAS2. 本地线程分配缓存 TLAB
ParallelOld
SerialOld(MSC)
Class类元信息
abstract ClassLoader
垃圾回收算法
操作数栈
标记-清除Mark-Sweep
标记-整理
程序计数器 PC Register
Old
加载
使用
线程私有
method1
可达性分析
SecureClassLoader
本地方法栈Native Method Stacks
标记-整理Mark-Compact
Servivo S1
共享
内存初始化
Parallel Scavenge
直接内存
验证
Serial
数组长度
JIT即时编译器JIT Compiler
垃圾收集器Garbage Collection
堆内对象
动态链接
ExtClassLoader
......
垃圾收集器 GC
1. 大对象直接进入老年代2. 长期存活对象将进入老年代(age15)3. 对象动态年龄判断4. 老年代空间分配担保机制
解释器interpreter
对象内存分配
应用程序类加载器
执行引擎 Execution Engine
类.main()
age 15?
C++调用java代码,创建JVM启动器实例sum.misc.lancher
AppClassLoader
0 条评论
回复 删除
下一页