Java基础-14-JVM内存区域划分

初识JVM内存区域划分

一个宿舍楼会划分成几个不同的区域: 大一学生, 大二学生… 计算机专业学生, 通信专业学生…
内存也是类似, 这个大走廊被分成很多部分, 每个区域存放不同的数据.
Java基础-14-JVM内存区域划分
程序计数器(PC Register):只是一个很小的空间,保存下一条执行的指令的地址。
虚拟机栈(JVM Stack):重点是存储局部变量量表(当然也有其他信息),比如说 int [ ] arr 这样的引用就在这里保存。
本地方法栈(Native Mrthod Stack):本地方法栈与虚拟机的作用类似。只不过保存的内容是Native方法的局部变量、方法的调用关系。在有些版本的JVM实现中(例如HotSpot),本地方法栈和虚拟机是一起的。
堆(Heap):JVM所管理的最大的内存区域,使用new创建的对象都是在堆上保存(例如 new int [ ]{1,2,3}),new出来的东西都在堆里。java中的GC机制就是回收堆上的垃圾。
方法区(Method Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池(Runtime Constant Pool):是方法区的一部分,存放字面常量与符号引用。
**线程(Thread):**每一个线程里面包含程序计数器,JVM栈 ,本类方法栈 每一个线程就是一个执行流。(多线程类似于一心多用)

Native方法:
JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和操作 系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数.
这里的 Native 方法就是指这些 C++ 实现的, 再由 Java 来调用的函数。

我们发现, 在上面的图中, 程序计数器, 虚拟机栈, 本地方法栈被很多个黄色的, 名叫 Thread(线程) 的方框圈起来了, 并且存在很多份. 而 堆, 方法区, 运行时常量池, 只有一份. (关于线程, 这是我们后面重点讲解的内容).
虚拟机栈和堆
Java基础-14-JVM内存区域划分
局部变量和引用保存在栈上, new 出的对象保存在堆上.
堆的空间非常大, 栈的空间比较小.
堆是整个 JVM 共享一个, 而栈每个线程具有一份(一个 Java 程序中可能存在多个栈)