java内存区域

Posted share2perfect

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存区域相关的知识,希望对你有一定的参考价值。

技术图片

技术图片

对象的创建

虚拟机遇到new指令后,会先去检查在常量池中(运行时数据区-方法区)是否可以定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化,如果没有,必须先执行相应的类的加载过程。

类加载检查通过后,虚拟机会为新生对象分配内存(堆上分配)

分配内存的方式:

1.指针碰撞:前提条件堆中内存是规整的,空闲的内存在一边,使用的内存在一边。中间放着一个指针作为分界点的指示器,需要多大内存,指针就滑向空闲等同的距离。

2.空闲列表:如果堆中内存不规则,使用的和空闲的交叉,那么虚拟机就需要维护一张表,记录那些内存是可用的,然后分配之后更新列表。

堆是否规整跟使用的垃圾回收器有关,如果垃圾回收器有标记整理的功能就会规整。

分配内存时如何解决并发问题:

1.使用同步功能(虚拟机采用CAS和失败重试保证原子性)

2.按照线程划分不同的空间进行分配(TLAB)

 对象的访问定位

技术图片

技术图片

对象的访问定位有两种方式:

1.使用句柄:如果对象移动,只需要改变句柄池中实例数据指针,而栈中的reference不需要修改

2.直接访问(Sun HotSpot采用该方式):速度更快,节省了一次指针对位的时间开销

以上是关于java内存区域的主要内容,如果未能解决你的问题,请参考以下文章

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

Java内存区域

java虚拟机java内存区域与内存溢出异常

java内存模型,内存区域

Java内存区域与模拟内存区域异常

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