一个宿舍楼会划分成几个不同的区域: 大一学生, 大二学生… 计算机专业学生, 通信专业学生…
内存也是类似, 这个大走廊被分成很多部分, 每个区域存放不同的数据。
JVM 的内存被划分成了几个区域, 如图所示:
<1>程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址.
<2>虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 比如创建的 int[] arr 这样的存储地址的引用就是在这里保存.
<3>本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的.
<4>堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存.
<5>方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据.方法编译出的的字节码就是保存在这个区域.
<6>运行时常量池(Runtime Constant Pool): 是方法区的一部分, 存放字面量(字符串常量)与符号引用. (注意 从 JDK1.7 开始, 运行时常量池在堆上)
Native 方法:
JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和操作系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数.
这里的 Native 方法就是指这些 C++ 实现的, 再由 Java 来调用的函数.
JVM 内存区域划分
最新推荐文章于 2024-03-10 16:44:38 发布