关于jvm内存区域(如下图所示),一说是分成四块,即方法区、java堆、java栈、本地方法栈,另一说是分成五块,在前四块基础上加上一个指令计数器及其他隐含寄存器。

其实本质都是一样的,寄存器确实也算一小块区域,但是有时候因为占的空间太小了也就没算在内了,下面对前四块的功能进行一个介绍与分析。

jvm内存区域分配_jvm


方法区(method)

方法区是系统分配的一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息的(类的描述信息)。
它保存方法代码(编译后的java代码)和符号表。存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
我通俗一点来说,就是方法区里面保存了类的很多信息,包括字段的信息(字段名、类型、修饰符)、方法的信息(方法名、参数类型、返回值类型、修饰符、异常、字节码)等等。
另外在方法区中还存在着一个静态区,像被static、final等修饰的变量(final修饰的自然是常量)都存放在静态区中。


java堆(heap) 和 java栈(stack)

这里我已经专门有一篇博文写过了,


本地方法栈(java中的jni调用)

​JNI​​​是​​Java Native Interface​​​的缩写,它提供了若干的​​API​​​实现了​​Java​​​和其他语言的通信(主要是​​C&C++​​​)。从​​Java1.1​​​开始,​​JNI​​​标准成为​​java​​​平台的一部分,它允许​​Java​​​代码和其他语言写的代码进行交互。(来自百度百科)
所以这一部分很明显就是用来支持​​​java​​​代码执行本地代码用的,需要注意的是,对于部分本地代码的执行,比如​​C/C++​​​,是不需要​​JVM​​的支持的。