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