程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理
jvm运行时内存中数据区可以大致分为5个区域,两种类型:
五个数据区域:
程序计数器
java虚拟机栈
本地方法栈
java堆
方法区
两种类型:
- 线程私有的数据区域(其生命周期与线程的生命周期保持一致)
程序计数器(program counter register): 程序计数器存储的值是字节码指令的起始地址, 字节码解释器通过程序计数器里的值来获取下一条将要执行的字节码指令.java中每个线程都需要一个独立的程序计数器, 各个线程之间的程序计数器互不影响, 独立存储, 因此是"线程私有"的.
java虚拟机栈(java vm stack): 方法执行时会创建一个栈帧, 用于存储局部变量表, 操作数栈, 动态链接, 方法出口等信息.每一个方法从调用直至执行完成的过程就对应着一个栈帧在虚拟机中入栈到出栈的过程.
本地方法栈(native method stack): 与java虚拟机栈类似, 不过java虚拟机栈为虚拟机执行java方法(字节码)服务, 而本地方法栈为虚拟机使用到的native方法服务
注: 在运行期间java虚拟机栈和本地方法栈可能会出现StackOverflowError 与 OutOfMemoryError异常
java虚拟机栈的图示:
- 所有线程共享的数据区域
- 方法区(method area): 用于存储已被虚拟机加载的类信息, 常量, 静态变量, 即时编译器编译后的代码等数据.
- java堆(heap): 几乎所有对象的实例都会在堆上进行内存分配和初始化
附:
直接内存(direct memory): 不是运行时虚拟机数据区的一部分, 该空间位于虚拟机外, 不过由于直接内存的性能较好, 所以有的工作需要使用直接内存来提高性能, 可以通过NIO和NIO2来申请直接内存.