目录
简单聊聊~
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。
今天介绍到这里,明天继续!
开发入门中,欢迎指教~
标签:Java,int,虚拟机,跨平台,线程,执行,方法 From: https://blog.csdn.net/m0_73455589/article/details/141096479