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