JVM内存划分

Java源代码文件(.java)--->经过编译成字节码文件(.class)--->然后经过JVM的各种类加载器将字节码文件加载到内存当中
--->加载完毕后由JVM执行引擎执行。在整个程序的执行过程中,JVM会用一段空间来存储执行期间所需要用到的数据,这段
空间被称为运行时数据区域(Runtime data area),也就是我们所说的JVM内存区域,平时我们所说的JVM内存管理,其实就是
针对Runtime data area区域进行管理和优化。

JVM内存区域的划分:
1. 堆(Heap)
在Java中堆是用来存放对象的,GC主要就是来管理回收堆内存,堆是被所有对象共享的,在JVM中只有一个.
2. 栈(VM Stack)
局部变量表:指在方法中声明的非静态变量和方法的形参,对于基本数据类型的变量,直接存储它的值,对于引用类型
存的是指向对象的引用.局部变量表在编译期间就已经确定大小了,因此在程序运行期间局部变量表的
大小是不会改变的.
操作数栈:
程序在方法中执行的过程就是在不断的赋值取值和计算,而这些操作都是借助操作数栈来完成的.
指向运行时常量池的引用:
在方法执行的过程中碰到的常量,这个引用就是指向运行时常量池的.
方法的返回地址:
当一个方法执行完毕后,要返回之前调用它的地方,因此在栈帧中需要保存一个方法的返回地址.
每个线程都会有自己的栈,互不干扰.
3. 方法区
跟堆一样被所有线程共享,此区域存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、
常量以及编译器编译后的代码等.
4. 本地方法栈
跟栈的作用和原理类似,栈是为java方法服务,而本地方法栈是为native方法服务的,在HotSpot虚拟机中栈和
本地方法栈指的是同一块内存区域.
5. 程序计数器(PC寄存器)
这块内存保存的是程序当前执行的指令的地址,当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的
指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者
根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.每个线程都会有自己独立的程序计数器,
并且不相互影响,在JVM规范中规定,如果线程执行的是native方法,那么程序计数器保存的值是undefined.还有就是
程序计数器中内存的数据所占用的空间大小不会随着程序的执行而改变,因此对于程序计数器这块内存是不会发生
OOM的.

猜你喜欢

转载自www.cnblogs.com/zhangjianbing/p/10149132.html
今日推荐