《深入理解Java虚拟机》二:Java内存区域与内存溢出异常

2018-11-22  本文已影响4人  亦猿非猿

断断续续把这本书的重点章节看完了,然而,重新回想一下,感觉又还回去了,既然这样,那就再刷一篇,用输出,归纳去倒逼自己理解!

这一章,主要讲解Java虚拟机内存的各个区域,以及对对象的创建,布局和访问进行大概讲解。

大纲

image

运行时数据区域

image

程序计时器(Program Counter Register)

Java虚拟机栈

本地方法栈

Java堆

方法区

Class文件常量池
运行时的常量池

直接内存

线程私有

Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。如果每个线程中都有一个独立的内存区域,各条线程之间互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

对象的创建,布局和访问

Java对象的创建

对象的内存布局

对象在内存中存储的布局可以分为3块区域:

对象的访问定位

目前主流的访问方式有使用句柄和直接指针两种,对主要虚拟机Sun HotSpot而言,它是使用直接指针进行对象访问。

使用句柄

Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,句柄中包含了对象实例数据与类型数据的具体地址信息。
优点:在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改。

image

直接指针

reference中存储的直接就是对象地址。
优点:速度更快

image
上一篇 下一篇

猜你喜欢

热点阅读