JVM的内存模型
概述
Java虚拟机在执行java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
java虚拟机所管理的内存包括以下几个运行时数据区域:
- 方法区(包括运行时常量池):存储类信息、常量、静态变量、即时编译器编译后的代码等;各种字面量和符号引用。
- Java堆:存储java对象。
- 虚拟机栈:存储方法以及方法中的存储局部变量表(存放基本数据类型和引用类型)、操作数栈、动态链接、方法出口等信息。
- 本地方法栈:和虚拟机栈类似,只不过存储的是native方法。
- 程序计数器:存储当前线程执行的字节码的行号。
其中属于所有线程共享的数据区是:方法区、堆;
属于线程隔离(线程安全)的数据区是:虚拟机栈、本地方法区、程序计数器。
Java堆
对大多数应用来说,Java堆是JVM管理的内存中最大的一块。在虚拟机启动时创建,唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,因此很多时候也叫GC堆。从内存回收的角度看,由于现在收集器基本都是采用分代收集算法,所以Java堆还可以细分为&#