Java虚拟机(jvm)在运行java程序的过程中会把它所管理的内存分为好几个区域,每个区域都会有每个区域各自的职责与功能。其中主要的区域包括:堆、虚拟机栈、本地方法栈、方法区、程序计数器。
1、堆:堆是jvm管理的最大一块内存,jvm会在对上面为对象和数组分配内存。堆又可以分为新生代与老年代,新生代又可以分为Eden空间、Survivor空间,这些我将在以后的文章中介绍。Java堆也是垃圾管理的主要区域,这个很好理解,因为占用空间最大,所以清理之后释放的空间也就多了。堆又可以被称为“GC堆”。
2、虚拟机栈:虚拟机栈是线程私有的,它随线程创建而创建,随线程消亡而消亡。主要描述的是方法的内存模型,方法执行师会创建一个栈帧,帧内存放局部变量表、操作数栈、动态链接、方法出入口等信息。局部变量表存放着编译器可知的基本数据类型、对象引用。
3、本地方法栈:与虚拟机栈的作用类似,只不过存放的是Native方法的有关信息。
4、方法区:存放已经被虚拟机加载后的类信息、常量、静态变量等等。此区域内包含常量池,顾名思义,就是存放编译期生成的各种字面量和符号引用。
5、程序计数器:也是线程私有的,它控制着处理器应该处理哪条指令。任何处理器某一时刻都只能处理一条指令,具体是哪条就需要程序计数器为处理器选择。