jvm的内存结构是jvm在执行字节码的时候所需要的内存区域。
图不想插了,手动画个图:
--------------------------------------
堆 | java栈 |
方法区 | 本地方法栈 |
| 程序计数器 |
---------------------------------------
按照分类的思想来进行划分:线程共享区,线程独占区。
因为jvm也是以线程来进行各种骚操作的,比如GC(垃圾回收过程)。
线程独占区(表示的是一个线程中需要那些东西):pc计数器,java栈,本地栈;
pc计数器:很好理解哦。就是排队打饭的一个序号。
本地栈:可以先不用理解具体是什么,主要功能是 调用系统的一些内置的函数。
java栈:重头戏。里面是一个一个的栈帧,栈帧就是一个一个的方法。传说的压栈出栈,就在这里。死循环递归不是会报栈溢出嘛。就在这哦。栈帧里面有局部变量表(保存本方法局部变量)、操作数栈(保存各种运行的数据)、动态链接(保存一些类的引用),方法出口(方法怎么结束)、等(书上写的等,我也不知道是什么,也不敢问)。
接下来就是线程共享区:
--------------------------------------
堆 | java栈 |
方法区 | 本地方法栈 |
| 程序计数器 |
---------------------------------------
包括两个:堆,方法区:
方法区最复杂,放到最后,先讲堆。
堆:存放类的实例。结束。by the way,这里是进行GC(垃圾回收)的重要访问地区。
方法区:静态的变量,静态的常量,类的编译信息,类的全限定名称(就是类在哪儿,例如:java.util.类名),常量池(类似于资源库,存储了 常量,域,方法的符号引用(在类编译的过程中,会有一个是将符号引用转化为直接引用),会在class文件、类加载中使用,),方法表(存储非虚拟类的方法的直接引用)。
到这里基本的内存结构就这些,哪里不对,或者有疑问,劳烦指正。