statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激
一、程序计数器
- 线程隔离性:线程隔离
- 作用:不必多说了,指示当前线程执行的指令
二、Java虚拟机栈
- 线程隔离性:线程隔离
- 作用:线程中的方法栈,其生命周期与线程一致,每一个方法的的调用过程都对应着一个栈帧的在虚拟栈中的入栈与出栈
- 异常:
-
StackOverflowError
: 如果线程请求的栈深度大于java虚拟机所允许的最大栈深度(参数可控) -
OutOfMemoryError
:如果虚拟机栈深度可以动态扩展(即可以自动申请所需要的内存来扩展虚拟机栈的深度),且动态扩展时无法申请到足够的内存
-
三、本地方法栈
- 线程隔离性:线程隔离
- 作用:线程中执行本地方法的栈
- 异常:
StackOverflowError
OutOfMemoryError
四、Java堆
- 线程隔离性:线程共享
- 作用:存放对象的实例,垃圾收集器的主要管理对象
- 异常:
-
OutOfMemoryError
:没有足够的内存可供分配
-
- 区域细分:
- 按照垃圾收集(分代收集)来分:
- 新生代:新生代存放朝生夕死的对象以及各种小对象
- 老年代:老年代存放长期持有的对象以及大对象
- 按照垃圾收集(复制收集算法)来分:
- Eden:存放普通对象
- Survivor:存放经历过垃圾收集而存留下来的对象的副本
- 其他:
- TLAB:线程私有的,线程用TLAB来解决多个线程在堆上分配内存的并发问题,当TLAB空间不足时,需要给线程分配新的TLAB空间,这时会进行上锁操作,防止出现并发问题
- 按照垃圾收集(分代收集)来分:
五、方法区
- 线程隔离性:线程共享
- 作用:存储被虚拟机加载的类信息、常量、静态变量等等,该区域的垃圾回收行为比较少,条件也比较苛刻,主要是针对常量池的回收和类的卸载。
- 异常:
-
OutOfMemoryError
: 没有足够的内存可供分配
-
- 区域细分:
- 运行时常量池:存储Class文件中定义的各种字面常量,如类的完全限定名称,方法名,普通字面常量等等,但是不仅仅只有Class文件中定义的各种字面常量会被存储在这个地方,运行时其实也可以存储新的常量进来
参考文档:
[1] [深入理解Java虚拟机 -- 周志明]
网友评论