一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
对象的访问定位包括句柄指针和直接指针两种,我们使用对象时,是通过栈上面的reference数据来操作 堆上的具体对象。reference数类型指向的仅仅是一个对象的引用,通过这个引用去访问对象的具体地址是取决于虚拟机的实现
1.句柄指针
句柄指针直接指向的是句柄池 句柄池里面有实例指针和类型指针 分别指向了实例数据和类型数据,这样的好处是在垃圾回收的时候对象地址很大概率会发生改变,只需要改变句柄里面的指针而 reference不需要变动
2.直接指针
直接指针直接指向的是对象的实例数据,相比句柄指针好处就是访问的更快因为少了一次指针定位, java访问对像非常频繁Sun HotSpot虚拟机正是使用的这种方式进行访问。
3.内存相关异常信息
虚拟机栈:
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常
本地方法栈:
与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。
堆:
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
方法区:
当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
运行时常量池
当常量池无法再申请到内存时会抛出OutOfMemoryError异常
直接内存
各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制), 从而导致动态扩展时出现OutOfMemoryError异常。