返回

内存模型之JVM运行时数据区域与Java进程内存

后端

对于一款应用,它的运行离不开进程。那么,什么是进程?在操作系统中,进程可以理解为一个正在运行着的程序,它由程序代码、程序所需要的数据、进程的运行环境和各种需要的资源组成。

那么,我们所说的JVM又是什么呢?JVM,全称Java Virtual Machine,译为Java虚拟机。从字面意思我们就可以理解为一台虚拟的机子,这台机子与我们现实生活中所用的物理机类似,它拥有自己的寄存器、执行引擎、栈、堆以及方法区。

了解了进程与JVM的概念,我们再来看一看两者之间的关系。当我们执行Java程序的时候,我们的JVM会开启一个进程。在此过程中,进程会占据一部分系统内存,而JVM运行时数据区域则占据一部分JVM进程内存。

想要了解JVM进程内存与Java运行时数据区域的关系,我们还得先来了解一下Java运行时数据区域。

Java运行时数据区域主要分为程序计数器、虚拟机栈、本地方法栈、堆、方法区和运行时常量池。其中:

  • 程序计数器: 一块较小的内存空间,用来存放当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器的工作是读取下一条需要执行的字节码指令,并将控制权交给当前字节码指令指定的代码。为了实现这个功能,Java虚拟机必须始终清楚当前线程所执行的字节码指令地址,即程序计数器。

  • 虚拟机栈: 是Java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧用来存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

  • 本地方法栈: 与虚拟机栈类似,也是一个方法执行的内存区域,但是它是为本地方法服务的。

  • 堆: 与Java代码无关,用于存放实例化对象的内存。在Java虚拟机中,堆是所有线程共享的一块内存区域,在虚拟机启动的时候创建。堆是被所有线程共享的一块内存,用于存储对象的实例,几乎所有的对象实例都在这里分配内存。

  • 方法区: 与堆类似,也是各个线程共享的内存区域。它是用来存放已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

  • 运行时常量池: 是方法区的一部分。用于存放编译期生成的各种字面量和符号引用。

当然,除了这些内存区域之外,Java虚拟机还有一些其他的内存区域,例如:

  • 直接内存: 不是Java虚拟机运行时数据区的一部分,而是直接向操作系统申请的内存,而不是Java堆。

  • 本机内存: 是直接内存的一个子集,它是Java代码在运行时所访问的,可由本地代码使用或分配的内存。

通过了解JVM进程内存与Java运行时数据区域之间的关系,我们可以更好地理解Java程序在运行时的内存模型。