java内存区域
Posted share2perfect
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内存区域相关的知识,希望对你有一定的参考价值。
对象的创建
虚拟机遇到new指令后,会先去检查在常量池中(运行时数据区-方法区)是否可以定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化,如果没有,必须先执行相应的类的加载过程。
类加载检查通过后,虚拟机会为新生对象分配内存(堆上分配)
分配内存的方式:
1.指针碰撞:前提条件堆中内存是规整的,空闲的内存在一边,使用的内存在一边。中间放着一个指针作为分界点的指示器,需要多大内存,指针就滑向空闲等同的距离。
2.空闲列表:如果堆中内存不规则,使用的和空闲的交叉,那么虚拟机就需要维护一张表,记录那些内存是可用的,然后分配之后更新列表。
堆是否规整跟使用的垃圾回收器有关,如果垃圾回收器有标记整理的功能就会规整。
分配内存时如何解决并发问题:
1.使用同步功能(虚拟机采用CAS和失败重试保证原子性)
2.按照线程划分不同的空间进行分配(TLAB)
对象的访问定位
对象的访问定位有两种方式:
1.使用句柄:如果对象移动,只需要改变句柄池中实例数据指针,而栈中的reference不需要修改
2.直接访问(Sun HotSpot采用该方式):速度更快,节省了一次指针对位的时间开销
以上是关于java内存区域的主要内容,如果未能解决你的问题,请参考以下文章