一、运行时数据区域
- 1.8版本之前:运行时数据区域包括线程共享的堆和方法区(包含运行时常量池);线程私有的虚拟机栈、本地方法栈和程序计数器。直接内存。
- 1.8版本之后:运行时数据区域包括线程共享的堆;线程私有的虚拟机栈、本地方法栈和程序计数器。直接内存。
二、各部件功能
1、 程序计数器
【1】功能描述:
(1)广义:配合字节码解释器的工作,让线程切换后得以恢复到正确的位置,每条线程都需要 有一个独立的程序计数器。
(2)狭义:
1)字节码解释器通过改变程序计数器来依次读取指令(选取下一条需要执行的字节码指 令),从而实现代码的流程控制。
2)多线程的情况下,程序计数器用来记录当前位置,当线程被切换回来的时候就可以知 道该线程上次运行到哪儿了。
【2】特点:各个线程之间的程序计数器互不影响、独立存储,每条线程都有一个独立的程序计数器。不会出现outofMemoryError,生命周期与程序计数器一样。
2、虚拟机栈
【1】功能描述:由一个个栈帧组成,存放局部变量表(存放编译期可知的各种数据类型、对象引 用)、操作数栈、动态连接、方法出口信息。每次函数调用都会有一个对应的栈帧被压入Java 栈,每一个函数调用结束,都会有一个栈帧被弹出。返回方式有以下两种形式:
(1)return语句;
(2)抛出异常;
【2】特点:Java 虚拟机栈会出现两种错误:StackOverFlowError
和 OutOfMemoryError
。
3、本地方法栈
【1】功能描述:运行Native方法。被执行的时候本地会创建一个栈帧,方法执行完毕弹出栈帧同时 释放内存空间也会出现 StackOverFlowError
和 OutOfMemoryError
两种错误。
4、堆
【1】功能描述:存放对象实例。
(1)分为:新生代(Eden区、Survivor0、Survivor1)、老生代
(2)对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进 入 s0 或者 s1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。
5、方法区
【1】功能描述:称为永久代。