学习整理——Java内存区域划分

来源:互联网 发布:angularjs 2.0不用node 编辑:程序博客网 时间:2024/05/17 23:32

内存区

C编译器在划分内存区域将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。Java的运行时jvm也会将内存区划分为不同的部分,包括了虚拟机栈、本地方法栈、程序计算器、堆区、方法区。



虚拟机栈

虚拟机栈也叫Java栈,存放的是一个个的栈帧,与C中的栈类似。每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址和一些额外的附加信息。虚拟机栈是线程私有的,即每一线程都会拥有的栈。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。


本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)(例如C Native)服务的。在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。


程序计数器

程序计数器保存了线程执行指令的地址,由于每个线程的执行情况都不同,所以每个线程都需要一个程序计数器。在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。


堆区

Java中的堆是用来存储对象本身以及数组(当然,数组引用是存放在Java栈中的)。在Java中,程序员基本不用去关心空间释放的问题,Java的垃圾回收机制(GC)会自动进行处理。因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。每个线程都可以使用堆里面的对象。


方法区

方法区与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。



0 0