学习整理——Java内存区域划分
2016-09-26 23:37
441 查看
内存区
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中只有一个堆。每个线程都可以使用堆里面的对象。方法区
方法区与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。相关文章推荐
- JVM学习01——Java内存区域划分及内存溢出
- jAVA内存区域划分
- JVM 学习笔记1 JAVA内存区域与溢出异常
- [java学习笔记]java语言基础概述之内存的划分&堆和栈
- 【Java】内存区域划分
- Java内存区域划分
- Java学习笔记47:Java 内存区域
- Java 虚拟机内存区域划分详解(1)
- java学习笔记]java语言基础概述之内存的划分&堆和栈
- JVM学习笔记一:Java内存区域
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
- Java 程序在执行时的内存划分区域
- java运行时内存区域划分(1)
- Java JVM内存结构,区域划分
- java内存区域的划分
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- Java内存区域划分、内存分配原理
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- Java内存区域划分、内存分配原理