jvm虚拟机
2021-08-17 09:23:20 12 举报
AI智能生成
jvm虚拟机
作者其他创作
大纲/内容
运行时数据区域
程序计数器
当前线程所执行的 字节码的行号指示器
Java虚拟机栈
栈帧
局部变量表
本地方法栈
Native
运行其他语言
Java堆
是虚拟机所管理的内存中最大的一块
存放对象实例
垃圾收集器内存管理区域
方法区
类信息
常量
静态变量
编译器编译后的代码缓存
也有很多人将其称为永久代,在jdk8后不再使用,改用与JRockit、J9一样在本地内存中实现的元空间(Meta- space)来代替
垃圾收集行为在这个区域的 确是比较少出现的
运行时常量池
存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中
编译时存储哪种数据都必须符合规范上的要求才会被虚拟机认可、加载和执行
对于运行时常量池, 《Java虚拟机规范》并没有做任何细节的要求
直接内存
并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中 定义的内存区域
本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到 本机总内存
设置-Xmx等参数信息
HOtSpot虚拟机
对象创建
类加载检查
TLAB
TLAB的全称是Thread Local Allocation Buffer,即线程本地分配缓存区,这是一个线程专用的内存分配区域
如果开启则在栈内分配,如果没有则判断java对是否规整
Java堆是否规整
垃圾收集器是否带有空间压缩整理的能力决定
Serial、ParNew等带压缩 整理过程的收集器
指针碰撞,既简单又高效
CMS这种基于清除 (Sweep)算法的收集器
采用较为复杂的空闲列表来分配内存
解决对象储存地址频繁移动
是采用CAS配上失败 重试的方式保证更新操作的原子性
每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲
对象的内存布局
对象头
实例 数据
和对齐填充
对象的访问定位
使用句柄
分出一块内存来作为句柄池
直接指针
各自的优缺点
OutOfMemoryError异常
垃圾收集器和内存分配
判断对象是否已死
引用计数算法
优点
缺点
如何判断java中没有使用
可达性分析算法
“GC Roots”的根对象作为起始节点集
GC Roots的对象
在虚拟机栈(栈帧中的本地变量表)中引用的对象
·在方法区中类静态属性引用的对象
在方法区中常量引用的对象
0 条评论
下一页