【深入理解Java虚拟机】Java虚拟机运行时数据区
Java虚拟机运行时数据区
线程私有
程序计数器
- 1、当前线程所执行的字节码的行号指示器。
- 2、唯一不会发生OutOfMemoryError的区域
- 3、如果执行的是java方法,计数器值为虚拟机字节码指令地址;如果执行native方法,值为空。
- 4、java多线程中一个时刻,一个处理器都只会执行一条线程中的指令,在线程轮流切换的过程中,每个线程都有自己的程序计数器,互不影响,以便线程切换恢复到正确的执行位置。
Java虚拟机栈
-
1、生命周期同线程相同
-
2、描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。
-
3、局部变量表存放编译期可知的基本数据类型(boolean、int、byte、short、double、long、float、char),对象引用(指向对象起始地址的指针或者是代表对象的句柄),returnAdress(指向字节码指令地址)
-
4、两种异常
- 1、StackOverflowError(线程请求的栈深度大于虚拟机允许的深度)
- 2、OutOfMemoryError(虚拟机栈动态扩展时无法申请到足够的内存)
本地方法栈
- 和虚拟机栈相似,区别为虚拟机栈为虚拟机执行Java代码服务,本地方法栈为虚拟机使用Native方法服务。
线程共享
Java堆
- 1、虚拟机管理最大的一块内存
- 2、虚拟机启动时创建
- 3、唯一目的:存放对象实例,几乎所有对象实例和数组都在这里分配
- 4、垃圾收集器管理主要区域(GC堆)
- 5、可以细分为新生代、老生代
- 6、可以通过-Xmx 和 -Xms 控制
- 7、堆中没有内存完成实例分配,且堆也无法再扩展时,就会OutOfMemoryError
方法区
- 1、目的:存放已被虚拟机加载的类信息、常量、静态变量等
- 2、永久代
- 3、HotSpot虚拟机才有的划分,方便垃圾收集器管理这部分内存
- 4、这个区域还包含运行时常量池存放字面量,符号应用
- 5、无法再申请内存时,就会OutOfMemoryError
XMind - Trial Version