Jvm内存结构及程序运行过程(1)

2021-08-17  本文已影响0人  lennasu

1. 初识JVM

问题:我们的.java 文件是怎么运行的?

解答:我们的.java 文件通过编译器编译成.class 文件 ,通过我们的ClassLoader 加载器加载到JVM运行时内存块。然后我们的CPU 去运行我们的程序。运行我们的程序是需要计算机里的很多模块配合的,如CPU ,内存,寄存器 等。所以,不管是什么语言编写的程序,只要最终编译成.class 文件,那我们的java 虚拟机 就可以运行他,只要安装了java 虚拟机,就可以在任何平台上跑java 的程序,这也是java 强大的原因。以前塞班系统上的应用程序就是用我们的java 写的。

问题:那我们的程序在虚拟机中又是怎么运行的呢?

解答:java虚拟机 也相当于我们的一个平台,一个宿主。每一个应用在java 虚拟机中都是一个独立的门户。当我们的应用需要到的程序文件时就会通过我们的ClassLoader 把.class 文件加载到JVM运行时内存中。ClassLoader 怎么加载的我们后续再解释。JVM 运行时内存大致可以分为五大类:方法区,堆区,虚拟机栈,本地方法栈,程序计数器。然而 我们的应用不可能都是一个线程,可能是多个线程。根据线程资源分配的话分为:线程共享区(方法区,堆区) 线程私有区(虚拟机栈,本地方法栈,程序计数器)。

现在我们分别来介绍一下这5个部分到底有什么作用,我们的程序在这5个功能模块上是怎么协调运行我们的程序的。

  1. 程序计数器:从字面上的意思可理解成 运行程序的一个标记的东西。 我们的java程序是多线程的,CPU 可以在多个线程中分配时间片。当我们的某一个线程被挂起时,我们的程序计数器就要记录当前代码执行到了那一行,下一次线程被唤醒时,程序继续从之前运行的那里开始运行。程序计数器的生命周期和线程是同步的。
  2. 虚拟机栈:说到栈,那就很明显就是先进后出的。当我们运行某一个方法时就会创建一个栈帧,我们运行的方法 会在这个栈帧中去操作。栈帧中包括局部变量表,操作数栈,动态连接,返回地址等。正常我们的程序会编译成字节码指令,会在操作栈中入栈出栈 计算出每个方法的运行结果,然后返回,退出方法。
  3. 本地方法栈:本地方法栈和虚拟机栈大致相同,主要就是执行本地方法 native 方法。JNI开发过程中会用到本地方法栈。
  4. 堆:JVM 运行时内存管理的最大的一块内存,该区域是存放我们对象实例,所以这块的内存回收和创建 都是非常重要的,内存是有限的,如果管理不当就会导致内存不够用,不够用就会出现OOM 。
  5. 方法区:方法区主要存储一些 加载的类的信息 版本号,字段,方法,接口 ,常量,静态变量。
上一篇下一篇

猜你喜欢

热点阅读