【读书会第十二期】Java虚拟机内存管理
运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域这是以来用户线程的启动和结束而建立和销毁。
程序计数器
由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。
虚拟机栈
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。
对象的创建
当内存分配完成并且对对象完成了初始化之后也不算完成创建,因为从Java程序的视角来看,对象创建才刚刚开始,构造函数,init方法还没有被执行,所有字段都还是默认的零值,这样一个真正可用的对象才算完全被构造出来。
对象的内存结构
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头,实例数据和对齐填充。
对象的访问定位
使用直接指针来访问的最大好处就是速度更快,它节省了一次指针定位的时间开销,由于对象访问在Java中非常频繁,因此这类开销积少成多也是一项极为可观的执行成本。
Java堆溢出
Java堆用于储存对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常。
栈溢出
栈容量只能由-Xss参数来设定
直接内存溢出
直接内存的容量大小可通过-XX:MaxDirectMemorySize参数来指定,如果不去指定,则默认与Java堆最大值一致
- 点赞
- 收藏
- 关注作者
评论(0)