2019-11-30小白都能看得懂的java虚拟机内存模型

同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。

同一个java代码在windows上生成的机器码可能是0101.......,在linux上生成的可能是1100......,那么这是怎么实现的呢?

不知道同学们还记不记得,在下载jdk的时候,我们在oracle官网,基于不同的操作系统或者位数版本要下载不同的jdk版本,也就是说针对不同的操作系统,jdk虚拟机有不同的实现。

那么虚拟机又是什么东西呢,如图是从软件层面屏蔽不同操作系统在底层硬件与指令上的区别,也就是跨平台的由来。

说到这里同学们可能还是有点不太明白,说的还是太宏观了,那我们来了解下java虚拟机的组成。

二、虚拟机组成

1.栈

我们先讲一下其中的一块内存区域栈,大家都知道栈是存储局部变量的,也是线程独有的区域,也就是每一个线程都会有自己独立的栈区域。

public class Math {

    public static int initData = 666;

    public static User user = new User();

    public int compute() {

        int a = 1;

        int b = 2;

        int c = (a+b) * 10;

        return c;

    }

    public static void main(String[] args) {

        Math math = new Math();

        math.compute();

        System.out.println("test");

    }

}

说起栈大家都不会陌生,数据结构中就有学,这里线程栈中存储数据的部分使用的就是栈,先进后出。

大家都知道每个方法都有自己的局部变量,比如上图中main方法中的math,compute方法中的a b c,那么java虚拟机为了区分不同方法中局部变量作用域范围的内存区域,每个方法在运行的时候都会分配一块独立的栈帧内存区域,我们试着按上图中的程序来简单画一下代码执行的内存活动。

你可能感兴趣的:(2019-11-30小白都能看得懂的java虚拟机内存模型)