首页 / 更多教程 / 深入理解JVM之内存区域
深入理解JVM之内存区域
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了深入理解JVM之内存区域,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2691字,纯文字阅读大概需要4分钟。
内容图文
以下是阅读《深入理解Java虚拟机--JVM高级特性与最佳实践》的读书笔记
本文结构:
运行时数据区域
HotSpot虚拟机对象那些事儿
对象的创建
对象的内存布局
对象的访问定位
运行时数据区域
程序计数器---当前线程所执行的字节码的行号指示器。
虚拟机栈---描述的是Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧。
局部变量表---存放编译期可知的各种基本数据类型、对象引用,其所需的内存空间在编译期间完成分配。
本地方法栈---与虚拟机栈类似,但虚拟机栈为虚拟机执行Java方法服务,而本地方法栈为虚拟机使用到的Native方法服务。
Java堆---存储对象实例,因是垃圾收集器管理的主要区域,也称为GC堆。
方法区---存储虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码等数据,且这区域的内存回收目标主要是针对常量池的回收和对类型的卸载。
运行时常量池---存放编译期生成的各种字面量和符号引用,具备动态性,运行期也可能将新的常量放入池中(String的intern方法)
直接内存---NIO类使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。
HotSpot虚拟机对象那些事儿
对象的创建
① 虚拟机遇到new指令,先去检查这个指令的参数在常量池中能不能定位到那个类的符号引用,并检查这个符号引用代表的类是否被加载、解析和初始化过,若无,必须先执行类加载过程。
② 类加载检查通过后,虚拟机为新生对象分配内存。
a) 指针碰撞---假设Java堆中的内存是绝对规整的,中间放一个指针作为分界点的指示器,分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。
b) 空闲列表---假设Java堆中的内存不是规整的,那虚拟机需要维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。
c) 选用哪种分配方式由Java堆内存块是否规整决定,Java堆是否规整又由所采用的垃圾收集器是否带有压缩管理功能决定。
d) 对象创建很频繁的情况下会导致虚拟机在分配内存的时候出现指针不同步的现象
1) 对分配内存空间的动作进行同步处理---CAS配上失败重试方式保证原子性。
2) 把内存分配的动作按照线程划分在不同的空间之中进行---哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时,才需要同步锁定。
e) 虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头)
f) 虚拟机要对对象进行必要的设置,将一些信息装进对象头中。
g) 只要在执行new指令之后接着执行<init>方法,这个对象才算是真正创建。
对象的内存布局
① 对象头
用于存储对象自身的运行时数据
类型指针(虚拟机通过这个指针来确定这个对象是哪个类的实例)
(如果对象是一个Java数组的话,还需要多一块用于记录数组长度的数据)
② 实例数据(对象真正存储的有效信息)
③ 对齐填充(占位符的作用,因为对象的大小必须是8字节的整数倍)
对象的访问定位
① 句柄---Java堆中将会划分出一块内存来作为句柄池,Java栈本地变量表中的reference存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。
② 直接指针---Java堆对象的布局中就必须要包含对象实例数据,Java栈本地变量表中的reference存储的就是这个对象地址。
内容总结
以上是互联网集市为您收集整理的深入理解JVM之内存区域全部内容,希望文章能够帮你解决深入理解JVM之内存区域所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。