【JVM】Java跨平台性质及Java虚拟机内存结构

目录

Java为什么可以跨平台

Java虚拟机的内存结构

简单聊聊~

Java为什么可以跨平台

Java编写的代码可以做到一次编译,多平台运行。这是为什么呢?

我们在使用Java之前先要去按照对应操作系统版本的JDK,JDK中包含了Java编译器,Java虚拟机,一些类库等。

在编写完代码之后,代码通过编译器进行编译生成字节码文件(也就是.java文件被编译成了.class文件),然后被java虚拟机执行。

在执行的过程中,不同操作系统版本下的java虚拟机就会将字节码文件解释为该操作系统能够理解的机器指令进行执行,从而达到在不同平台下运行结果的统一。

Java虚拟机的内存结构

Java虚拟机内存结构包含方法区,堆区,虚拟机栈,本地方法栈,程序计数器这五个部分。

当运行字节码文件时,会将类信息放入方法区,由字节码执行引擎来执行代码。

每个线程独享有一个虚拟机栈,本地方法栈,程序计数器来存放执行过程中的数据,而所有的线程共享堆区和方法区中的数据。

虚拟机栈内由一个个栈帧组成,而一个方法对应一个栈帧内存。

栈帧由四个部分组成:

局部变量表,操作数栈,动态链接,方法出口

public class Test {
    public static void main(String[] args) {
        int a = 2;
        int b = 1;
        int c = add(a, b);
        System.out.println(c);
    }
    public static int add(int o1, int o2) {
        return o1+o2;
    }
}

局部变量表用于存放a,b这些变量对应的值,如果是对象则是该对象在堆中对应的内存地址,

而操作数栈是用来辅助计算的,

当执行引擎执行到int c = add(a, b)这行代码时,应当要跳到add方法所在的方法区的内存地址去执行代码,而动态链接则是保存了add方法的内存地址。(所以动态链接就是保存了方法中所调用方法的内存地址)

假如当前进入了add方法执行完后要返回到main方法中继续执行,就需要看方法出口,方法出口中保存了main方法的内存地址。(所以方法出口就是保存了要返回的方法的地址)

而本地方法栈类似虚拟机栈,区别是本地方法栈的每一个栈帧对应的是一个本地方法(即被native修饰的方法),用来存本地方法执行过程中的数据。

程序计数器是用于记录线程执行到了哪一行代码,实际存的是当前执行到的代码的下一行代码的内存地址。

假设一个线程A被挂起,转而运行另一个线程B,过一段时间,这个线程A恢复了运行,就可以通过程序计数器来看执行到了哪一行代码,然后继续运行线程A。

今天介绍到这里,明天继续!

开发入门中,欢迎指教~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱好怪奇的奈斯

你是我更新的最大动力~么么哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值