JVM内存划分
JVM,即Java虚拟机,是通过软件模拟的具有完整硬件功能,运行在完全隔离环境中的计算机系统.它通过软件模拟Java字节码指令集,JVM只保留了PC寄存器,而普遍的虚拟机有很多寄存器.
Java内存划分
Java内存区域一共划分为6块,如下图:
其中,线程私有内存:
1. 程序计数器
程序计数器是比较小的内存空间,它是当前线程所执行的字节码的行号指示器.
若当前线程执行的是Java方法,计数器记录的是正在执行的JVM字节码指令地址.
若当前线程执行的是Native方法,计数器为空
它是唯一一块不会产生OOM(OutOfMemory)的区域.
2. 虚拟机栈
描述Java方法执行的内存模型.
每个方法执行的同时都会创建一个栈帧存储局部变量表,操作数栈,方法出口等信息.每个方法从调用到执行完毕的过程,对应一个栈帧在虚拟机栈的入栈与出栈过程.生命周期与线程相同:在创建线程时同时创建此线程的虚拟机栈,线程执行结束,虚拟机栈与线程一同被回收.此区域一共有两种异常:
- 若线程请求的栈深度大于JVM允许的深度(-xss设置栈深度)抛出*Error(常见于单线程)
- 虚拟机在进行栈的扩展时,若无法申请到足够内存,抛出OOM异常.(常见于多线程)
3. 本地方法栈
本地方法(Native方法)执行的内存模型,和虚拟机栈相同,HotSpot虚拟机中,本地方法栈与虚拟机栈是同一块内存区域
线程共有内存:
1. 堆(GC堆):
Java堆是JVM管理的最大的内存区域,在JV,启动时创建,所有线程共享此内存,此内存存放的都是对象的实例和数组.Java堆是垃圾回收期管理的最主要的内存区域,Java堆可以是物理上不连续的内存空间.使用-Xmx设置堆的最大值.-Xms设置最小值.若在堆中没有足够的内存完成对象实例分配并且堆无法再次扩展时,抛出OOM异常.
2. 方法区
用于储存已被JVM加载的类信息,常量,静态变量.方法区无法满足内存分配需求时抛出OOM异常.
3. 运行时常量池
运行时常量池是方法区的一部分,存放字面量和符号引用.
(字面量:字符串常量(JDK1.7移动到了堆中),final常量,基本数据类型
符号引用:类,字段,方法的完全限定名,名称,描述符)
eg:
public class Test{
public static void main(String[] args){
Test test = new Test();
int a = 10;
}
}
栈:test和a.
堆:new Test()
方法区:public class Test{} public static void main(String[] args)
运行时常量池:10
上一篇: FileFilter过滤器的使用方法