黑马程序员技术交流社区
标题: 【杭州校区】关于JVM内存模型的理解 [打印本页]
作者: 小江哥 时间: 2019-11-21 12:31
标题: 【杭州校区】关于JVM内存模型的理解
内存模型内存模型如下图所示
堆堆是Java虚拟机所管理的内存最大一块。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例。所有的对象实例都在这里分配内存
Java堆是垃圾收集器管理的主要区域。从内存回收的角度来看,由于现在的垃圾收集器采用的是分代收集算法。所以,java堆又分为新生代和老年代。从内存分配的角度来说,线程共享的java对中可能划分出多个线程私有的fenp缓冲区(Thread Local Allocation Buffer)。
可以通过 -Xms、-Xmx分别控制堆初始化是最小堆内存和最大堆内存大小。
虚拟机栈与程序计数器一样,java虚拟机栈也是线程私有的,他的生命周期与线程相同。
虚拟机栈描述的是Java方法的执行的内存模型:每个方法在执行的同时会创建一个栈桢(stack frame)用于存储局部变量表、操作数栈、动态链表、方法出口等信息。每个方法从调用直至执行完成的过程,就对应着栈桢在虚拟机栈中入栈到出栈的过程。
虚拟机栈存储的数据类型- 局部变量表
存放的是编译器可知得到各种基本数据类型boolean、byte、char、short、int、float、long、double、对象引用(refrence类型,不等同于对象本身,一个指向对象的起始内存位置的引用指针) - 操作数栈
- 动态链表
- 方法出口
...
常见异常本地方法栈方法区(1.8后该区域被废弃)程序计数器运行时常量池对象创建过程内存分配对象的内存布局对象头(Heading)- 对象头包括两部分信息
用于存储对象自身运行时数据。
如哈希码,GC分代年龄、锁状态标志、偏向线程ID。这部分s数据的长度在32位和64位的虚拟机中分别为32bit和64bit。
对象的访问定位句柄访问如果使用句柄访问的话,那么java堆中就会划分出一块内存来座位句柄池,refrence中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据的各自具体的地址信息。指针直接访问如果使用指针直接访问,那么java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,而refrence中存储的直接就是对象地址
这个两种访问方式各有优势,使用句柄访问的最大好处就是refrence中存储的是稳定的句柄地址,在对象被移动(垃圾收集时)只会改变句柄中对象实例指针,refrence本省不需要修改。
使用直接指针访问的方式最大的好处就是速度更快,节省了一次指针定位的事件开销。由于对象的访问在java中非常频繁,一次这类开销积少成多也是一个比较客观的优化。
-
1574310490688.jpg
(82.56 KB, 下载次数: 57)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |