- 运行时数据区
- 程序计数器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
- 运行时常量池
- 直接内存
程序计数器是一块较小的空间,可看作线程的当前执行字节码的行号指示器.用来控制分支、循环、跳转、异常处理、线程恢复等基础功能.
每个线程都有一个独立的程序计数器,各个线程之间互不影响,是线程私有的.
如果线程正在执行的是java方法代码,则计数器记录的是字节码指令的地址,如果正在执行的Native方法,则计数器的值为Undefined.程序计数器是Java虚拟机规范中唯一没有规定任何OutOufMemoryError情况的的区域
Java虚拟机栈也是线程私有的,生命周期与线程相同
虚拟机栈描述的是Java方法执行的内存模型:每个方法在线执行的时候都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息.方法执行到完成,对应一个栈帧入栈到出栈的过程.
此区域操作不当会抛出OverFlowError和OutOfMemoryError
本地方法栈与虚拟机栈类似,区别在于虚拟机栈为虚拟机执行java方法,即字节码,而本地方法栈执行的是Native方法.此区域操作不当会抛出OverFlowError和OutOfMemoryError
Java堆堆是java虚拟机管理的内存中最大的一块.是线程共享的,在虚拟机启动是创建.
此区域用来存放对象实例.Java堆是垃圾收集器管理的主要区域.由于收集器都采用分代算法,因此Java堆还可以细分为新生代和老年代.再细致还可以再分:Eden空间、From Survivor空间、To survivor空间.此区域会抛出OutOfMemoryError异常.
方法区和堆一样,是线程共享的,用于存储被虚拟机加载的类信息、常量、静态变量、即时编译后的代码.Java虚拟机规范规定,当方法区无法满足内存分配需求时,会抛出OutOfMemoryError异常
运行时常量池运行时常量池(Runtime Constant Pool),它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。运行时常量池和Class文件常量池的有个重要的区别就是运行时常量池具备动态性,即不仅仅是预置入Class文件中的常量池才能进入运行时常量池,程序运行期间,可以将新的常量放入池中,例如String.intern()方法.
运行时常量池既然时方法区的一部分,自然也会抛出OutOfMemoryError异常
直接内存有一种叫法,堆外内存。
直接内存(堆外内存)指的是Java应用程序通过直接方式从操作系统中申请的内存。这个的差别与之前的堆,栈,方法区不同。那些内存都是经过了虚拟化的内存。
使用Java的Unsafe类,可以操作直接内存



