JVM运行流程/运行时数据区-创新互联

JVM运行流程

程序在执行之前先要把 java代码 转换成 字节码文件 (.class文件), JVM 首先需要把字节码通过一定的方式 类加载器 (ClassLoader) 把文件加载到内存中 运行时数据区 (Runtime Data Area) , 而字节码文件是 JVM 的一套指令集规范, 并不能直接交给底层操作系统去执行, 因此需要特定的命令解析器 执行引擎 (Execution Engine) 将字节码翻译成底层系统指令再交由CPU去执行, 而这个过程中需要调用其他语言的接口 本地库接口 来实现整个程序的功能.

创新互联建站是一家专注于成都网站建设、成都网站设计与策划设计,商洛网站建设哪家好?创新互联建站做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:商洛等地区。商洛做网站价格咨询:028-86922220

总的来看, JVM主要通过以下四部分来运行Java程序:

  1. 类加载器
  2. 运行时数据区
  3. 执行引擎
  4. 本地库入口

通俗来讲 JVM 划分的区域就是:

  1. 堆: 存放的是 new 的对象.
  2. 方法区: 放的是 类对象. (加载好的类).
  3. 栈: 放的是方法之间的调用关系.
  4. 程序计数器: 放的是下一个要执行的指令的地址.

而在栈中还能分两部分:

  • 虚拟机栈 (Java 里面用来保存调用关系的内存空间)
  • 本地方法栈 (本地方法, 也就是 JVM 内部 C++ 写的代码, 调用关系的内存空间)

这里经常会有一个小的试题出现: 看代码.

package Test;

public class Demo {
    private int n = 10;
    private static int m = 20;

    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

问: 在当前代码中, n 在内存中的哪个区域? m 在内存中的哪个区域? demo 在内存中的那个区域?

答: n是成员变量, 就是在堆上.  m是静态变量, 在类对象里, 就是在方法区中. demo是局部变量, 就是在栈上. 

另一段代码:

package Test;

class A {
    private int x = 10;
}

public class Demo {
    private int n = 10;
    private static int m = 20;

    private static A a = new A();
    
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

在看这段代码, 在这段代码中, 问: x 在内存中的哪个区域? a在内存中的哪个区域?

答: 首先 a 是静态的, 那么它仍然在方法区中, 但是它 new 的 A(), 还是在堆里, 所以 x 也是在堆里. 

内存划分

JVM 运行时数据区域也叫内存布局, 它由一下五个部分组成:

从上图我们可以看出, 栈 是每一个线程都有的, 然后在图中是没有方法区的, 多了一个元数据区, 大家看到了吗, 方法区是 JDK1.7 之前的版本, 到了 1.8 之后, 把之前的方法区给去掉了, 弄出来这个元数据区, 他们两个的区别就是: 元数据区的内存不是在 JVM 中的, 之前方法区是在 JVM 申请到的这一大块内存里, 划分的区域. 元数据区呢是用的本地内存. 

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站名称:JVM运行流程/运行时数据区-创新互联
分享地址:http://pwwzsj.com/article/dhpjss.html