JVM
2020-09-22 10:35:18 86 举报
AI智能生成
JVM java虚拟机
作者其他创作
大纲/内容
可以看做一台抽象的计算机,有自己的指令集和各种运行时内存区域
是Java语言实现跨平台、与硬件无关的关键部分
运行在操作系统之上,与硬件没有直接交互?
与Java语言无关,只与特定的二进制格式文件即class文件格式相关联
Class文件中包含了JVM指令集(或者称为字节码、Bytecodes)、符号表以及其他辅助信息
概述
10个主要组成部分:魔数、版本号、常量池、访问标记(access_flags)、当前类(this_class)、父类(super_class)、接口、字段、方法、属性(attribute)。
attribute中包含了成员方法具体代码翻译成的字节码,包括局部变量表,操作数栈,动态链接,方法返回地址
常用字节码指令:astore,aload
Class文件格式
程序计数器,线程独享,不会出现溢出
PC
线程独享
一个线程对应一个栈?
存放一个个栈帧,一个方法对应一个栈帧
对于static方法,第一个变量是方法里的形参,然后是方法里定义的局部变量
对于非static方法,第一个变量是this,接着是形参,然后是方法里定义的局部变量
局部变量表
操作数栈
动态链接
方法返回地址
栈帧
JVM Stack
Native Method Stack
部分垃圾回收器使用的模型
新生代:Eden+from+to,YGC,MinorGC
老年代,FGC,MajorGC
分代模型
Heap
不会触发FGC
存储字符串常量、Class对象
必须指定大小
1.7及之前实现方式是永久代
会触发FGC
字符串常量、Class对象存储在堆
不强制指定大小,受限于物理内存
1.8及之后实现方式是Meta Space
方法区
这个应该不算在运行时数据区...
直接内存
运行时数据区
64位机,占用8字节,存储锁信息,GC信息,hashcode等
MarkWord
类型指针,如果开启压缩指针,占用4字节,不开启占用8字节,jdk1.8默认开启压缩指针
开启压缩指针 -XX:+UseCompressedClassPointers,可以手动关闭 -XX:-UseCompressedClassPointers
ClassPointer
Object Header对象头
基本数据类型,按规定大小,比如int占用4字节
引用类型数据,如果开启压缩指针,占用4字节,否则占用8字节
默认开启压缩指针,开启/关闭方式 -XX:+/-UseCompressedOops
经agent测试,static变量不计算在内
instance data实例数据
填充对齐,使整个对象占用空间字节大小为8的整数倍
padding
比普通对象多一个4字节大小的数组长度
数组对象
对象内存布局
1、逃逸分析,标量替换等过程,尝试在栈上分配
2、如果对象很大,直接在老年代分配
3、如果对象不是很大,先尝试在TLAB上分配,TLAB是线程独有的,分配对象时不需要加锁,效率高
4、否则在Eden区分配
对象分配过程
主要出于安全考虑
自底向上查找类是否已加载,然后自顶向下实际加载
BootstrapClassloader 加载核心类库
启动类加载器
ExtClassLoader 加载扩展类库
扩展类加载器
AppClassloader 加载classpath下的类
应用类加载器
实现findclass方法,遵守双亲委派
实现loadClass方法,可以打破双亲委派机制
采用了设计模式中的模板方法
继承ClassLoader类
自定义类加载器
双亲委派
机制
将class文件加载到内存,并创建一个Class对象指向这片内存
load
验证class文件格式是否符合规范
verification
给static变量赋默认值
preparation
将符号引用解析为直接引用
resolution
给static变量赋初始值
initializing
过程
类加载
new 申请内存,给成员变量赋默认值
复制一份操作数栈中的变量,在调用构造方法时弹出
dup
invokeSpecial <init> 调用构造方法,给成员变量赋初始值
astore 与引用变量建立关联
对象创建过程
直接指针
句柄池
对象定位
对象
没有任何引用指向的对象
一堆对象相互引用,但是没有任何引用链与根对象建立关联
什么是垃圾
较难解决循环引用问题
引用计数法
GC Roots:线程栈变量、常量、静态变量、JNI指针
根可达算法
如何定位垃圾
空间不连续,会产生碎片
标记清除 Mark Sweep
效率高,不会产生碎片,但是浪费空间
拷贝 Copying
不会产生碎片,不浪费空间,但是效率稍低
标记压缩 Mark Compact
垃圾回收算法
Serial 、Serial Old 串行
jdk1.8默认GC
Parallel Scavenge、Parallel Old 并行
ParNew是PS增强版,配合CMS使用CMS:初始标记、并发标记、重新标记、并发清除
ParNew、CMS
G1
ZGC
Shanoadh
Eplison
垃圾收集器
-Xmn 年轻代大小
-Xms 最小堆大小
-Xmx 最大堆大小
-Xss 栈空间大小
-XX:SurvivorRadio=6,设置Eden:2个Survivor=6:1,即整个年轻代空间比例为1:1:6
-XX:+PrintCommandLineFlags 打印启动时的命令行参数
-XX:+PrintGC/GCDetails 打印GC信息
常用参数
GC
JVM
0 条评论
下一页