第二章. 自动内存管理机制

Java内存区域与内存溢出异常

java虚拟机在执行Java程序过程中会把它管理的内存划分为若干个不同的数据区域

程序计数器

Java虚拟机栈

本地方法栈

Java堆

方法区

运行时常量池

HotSpot虚拟机对象探秘

对象的创建

首先,检查这个指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化

对象的内存布局

内存中的布局可以分为3块区域:对象头、实例数据和对齐填充

对象头

对象头包括两部分: 1. 第一部分用于存储对象自身的运行时的数据 ,32bit Mark Word,25bit用于存储对象哈希码,4bit存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0. 2. 另一部分是类型指针,对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例

实例数据

实例数据是对象真正的存储的有效信息,也是在程序代码中所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的,都需要记录起来.

对齐填充

对齐填充并不是必然存在的,也没有特别的含义,它仅仅起到占位符的作用

对象的访问定位

reference类型在Java虚拟机规范中只规定了一个指向对象的引用,目前主流的访问方式有使用句柄和直接指针两种 1. Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息 2. Java堆对象的布局需要考虑如何放置访问类型数据相关的信息,而reference中存储的就是对象地址 优缺点: 1. 使用句柄访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改 2. 直接指针访问速度更快

Java堆溢出

Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出 1. 内存溢出,内存泄露 可以通过工具查看GC Roots的引用链来确定问题 2. 通过检查-Xmx -Xms的内存来确定问题

虚拟机栈和本地栈溢出

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/60874.html

(0)
上一篇 2021年8月10日 18:50
下一篇 2021年8月10日

相关推荐

发表回复

登录后才能评论