JVM概述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

句柄访问
详看对象访问句柄
图 优点:对象移动reference不用修
改,句柄池更新即可
直接指针访问 优点:速度块
详细看对象指针图
假设内粗不规整,占用内存后的对象 会记录在一张列表上
04
内存分配策略
内存分配策略
年轻代
01
对象主要分配在新生代的Eden
区域
02
启动本地线程分配缓存的话,则
优先在TLAB上分配
jinfo 实时查看,调整虚拟机 参数
jhat 虚拟机堆转储快照分 析工具
jstat 监视虚拟机各种运行 状态的信息
jmap 生成堆转储快照
jstack 生成虚拟机当前时 刻的线程快照
06
类文件结构
类文件结构
class文件是一组以8字节为基础单位的二进制流
由无符号数和表构成
07
实战
实战
Java 堆 溢出
3.对象的内存布 局
B:实例数据
类的字段信息,包括父类 的字段信息等
存储顺序受分配策略的 影响:相同宽度的字段总 是被分配到一起
父类中的字段信息在子 类之前
3.对象的内存布 局
C:对齐填充
虚拟机要求对象大小是8 字节的整数倍
如果对象大小不是8字节 的整数倍的话,需要通过 占位符补全
4.对象的访问定位
象引用失效的时候,计数器就减1. 计数器值为0的时候,此对象为垃圾
优点:判定效率高
缺点:对象间循环依赖,此算法 无法正确判断是否为垃圾对象 主流虚拟机没有 这种算法
对象回收的判断
1.引用计数算法
2.可达性分析算法
GC Roots\"的对象作为起始点 从 这些节点开始向下搜索, 搜索所走过 的路径称为引用链(Reference Chain) 当一个对象到GC Roots没 有任何引用链相连时, 则证明此对 象是不可达的
计数器值为空
3
3.字节码指示器:通过改变 这个计数器的值来选取下
一条需要执行的指令
6
6.不会内存溢出
程序计数器PCR
运行时数据区域
java虚拟机栈
1.线程私 有
2.生命周 期和线程 相同
3.每个方 法创建栈 帧
java虚拟机栈
1.线程私有
java虚拟机栈
2.生命周期和线程相 同
3.每个方法创建栈帧
以使用指针碰撞
D:并发情况下线程不安全
E:内存分配好的话将内存空间初 始化为0,然后将hashCode,分代
年龄等信息保存在对象头
同步 按照线程划分在不同的空间TLAB
3.对象的内存布局
01
A:对象头
02
B:实例数 据
03
C:对齐填 充
3.对象的内存布局
A:对象头
第一部分存储hashCode,分代年龄,锁信息等数据(MarkWord) 第二部分类型指针(通过这个指针确定是哪个类的实例) 数组的话还存储数据的长度
(永久代)方法区
(永久代)方法区
01 1.线程共享
02
2.存储虚拟机加载的类信息,常量,静态变量,即时编译器编译后的 代码
03
3.运行时常量池(存储编译器生成的字面量和符号引用)
02
直接内存
直接内存
NIO中使用这块内存居多
非堆内存受总内存大小限 制
03
对象的创建
对象的创建
01
A:检查这个指令的参数 能否在常量池中找到类 的符号引用
JVM
演讲人
2 0 2 0 - 11 - 2 4
01 运行时数据区域
运行时数据区域
程序计数
A
器PCR
java虚
B
拟机栈
本地方
C
法栈
Java
D

(永久代)
E
方法区
1
1.较小的内存
4
4.线程私有
运行时数据区域
程序计数器PCR
2
2.当前线程执行的字节 码行号指示器
5
5.如果执行的是java方法, 则记录的是字节码指令的 地址,如果是Native方法,
03
优先将对象分配在新生代上,Eden区
域内存不够时发送Minor GC
老年代
大对象直接进入老年代 可以配置参数指定大于多大对象直接
进入老年代,防止年轻代内存复制频繁 长期存活的对象进入老年代
1.虚拟机给对象添加年龄计数器 2.动态年龄判断 3.空间分配担保
05
常用的工具
常用的工具
jps 显示指定系统内所有的 虚拟机进程
A.存放编译器可知的 各种基本数据类型,
对象引用 B.64位的 long,dubbo占用两
个Slot C.所需的内存在编译
器就确定
1.局部变 量表
01
2.操作数 栈
02
3.动态连 接
03
4.返回地 址
04
A:线程请求的栈深 度大于虚拟机允许
的深度 B:栈拓展内存不够
用,内存溢出
5.异常情 况 05
运行时数据区域
作为GC Roots对象
本地方法栈
1.线程私 有
2.执行的 是native 方法
3.异常情 况和虚拟 机栈相同
本地方法栈
1.线程私 有
2.执行的 是native 方法
3.异常情 况和虚拟 机栈相同
1.jvm中 内存最大 的一块
4.垃圾回 收的主要 区域
运行时数据区域
Java 堆
2.线程 共享
5.新生 代
3.存放 对象实 例
7.多个线程 私有的分配 缓存区TLAB
9.异常:内存 溢出
Java 堆
5.新生代
1.Eden
2.From Survivor
3 . To Survivor
运行时数据区域
01 1.线程共享
02
2.存储虚拟机加载的类信息,常量,静态 变量,即时编译器编译后的代码
03
3.运行时常量池(存储编译器生成的字 面量和符号引用)
6.老年 代
运行时数据区域
Java 堆
8.物理上不 连续的内存 空间
7.多个线程 私有的分配 缓存区TLAB
9.异常:内存 溢出
1.jvm中 内存最大 的一块
4.垃圾回 收的主要 区域
Java 堆 2.线程 共享
5.新生 代
3.存放 对象实 例
6.老年 代
Java 堆
8.物理上不 连续的内存 空间
方法区溢 出
虚拟机栈 溢出
常量池溢 出
本地方法 栈溢出
本机直接 内存溢出
Hale Waihona Puke Baidu
08
垃圾回收
垃圾回收
对象回收 的判断
方法区回 收
垃圾收集 算法
垃圾收集 器
GC日志
1.引用计数 算法
1
垃圾回收
对象回收的判断
2.可达性分 析算法
2
STEP1 STEP2 STEP3
给对象添加一个引用计数器,
每一个地方引用它,计数器值就加1, 对
03
C:没有的话先进行类
加载过程
02
B:检查这个符号引用是 否已经被加载,解析,初 始化过
1.new 指令创建对象
04
D:类加载完成后,分
配内存
2.分配内存方式
A:指针碰撞
假设内存规整,指针一边是空闲空间一边 是被分配空间,通过指针移动表示使用了 多少内存
B:空闲列表
C:两种方式取决于垃圾收集器类 型,带有压缩整理的垃圾收集器可
相关文档
最新文档