jvm内存区域分配
参考资料:
https://blog.csdn.net/qq_33384065/article/details/80282023
https://blog.csdn.net/wang_1997/article/details/52267688
关于jvm内存区域(如下图所示),一说是分成四块,即方法区、java堆、java栈、本地方法栈,另一说是分成五块,在前四块基础上加上一个指令计数器及其他隐含寄存器。
其实本质都是一样的,寄存器确实也算一小块区域,但是有时候因为占的空间太小了也就没算在内了,下面对前四块的功能进行一个介绍与分析。
方法区(method)
方法区是系统分配的一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息的(类的描述信息)。
它保存方法代码(编译后的java代码)和符号表。存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
更详细的可以见:https://blog.csdn.net/wang_1997/article/details/52267688
我通俗一点来说,就是方法区里面保存了类的很多信息,包括字段的信息(字段名、类型、修饰符)、方法的信息(方法名、参数类型、返回值类型、修饰符、异常、字节码)等等。
另外在方法区中还存在着一个静态区,像被static、final等修饰的变量(final修饰的自然是常量)都存放在静态区中。
java堆(heap) 和 java栈(stack)
这里我已经专门有一篇博文写过了,请参看:https://blog.csdn.net/qq_32623363/article/details/87626195
本地方法栈(java中的jni调用)
JNI
是Java Native Interface
的缩写,它提供了若干的API
实现了Java
和其他语言的通信(主要是C&C++
)。从Java1.1
开始,JNI
标准成为java
平台的一部分,它允许Java
代码和其他语言写的代码进行交互。(来自百度百科)
所以这一部分很明显就是用来支持java
代码执行本地代码用的,需要注意的是,对于部分本地代码的执行,比如C/C++
,是不需要JVM
的支持的。