大家好,又见面了,我是你们的朋友全栈君。
马上就要找实习了,趁着现在有时间,做个小小的面试总结,部分原创,大部分是在网上搜集。
java虚拟机是一种抽象化虚拟的计算机,java虚拟机有完善的一套硬体架构,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。java虚拟机屏蔽了当前使用的操作系统平台的相关信息,使得java程序只需生成相关的java字节码文件(class文件)便可在多平台运行。
java的一个非常重要的特性就是与平台的无关性。
一般的高级语言如C语言,如果要运行程序,需要经过编译成不同的目标代码。而java虚拟机在不同的平台上不需要编译即可运行程序。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
Java虚拟机支持Java语言的基本数据类型有8种,注意String(引用类型)不是基本数据类型如下:
byte、short、int、long、float、double、char、boolean。
虚拟机支持的其它数据类型包括:
object//对一个Javaobject(对象)的4字节引用
returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令
注:Java数组被当作object处理。
Java指令也是由操作码和操作数两部分组成。操作码为8位二进制数,操作数进紧随在操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数。Java的8位操作码的长度使得JVM最多有256种指令,java1.6及以上版本已使用了160多种操作码。
JVM只设置了4个最为常用的寄存器。它们是:pc程序计数器optop操作数栈顶指针frame当前执行环境指针 vars指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。
作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息:局部变量,执行环境,操作数栈。
在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。
JVM有两类存储区: 常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及字符串常量。方法区则用于存储Java方法的 字节码。JVM 虚拟机相当于80×86计算机系统,Java 解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。Java解释器相当于运行Java 字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。
public class Test {
public static void main(String[] args){
System.out.println(“Hello World!”);
}
}
输出:
Hello World!
步骤:1:编写java程序,生成.java文件 2:编译java文件生成字节码文件(class文件) 3:装载、连接、初始化数据 4:类实例生成,垃圾回收。
从虚拟机的角度,最开始是面对的class文件,读入并解析class文件,将PC寄存器设置为main入口,然后开始执行字节码。字节码总是针对运算栈的,所以虚拟机知道操作数就在运算栈那里。字节码由操作符和操作数定义,操作数可能为Java栈的局部变量,可能为常量池的引用。如果是常量池的引用,并且还未解析,则需要进行解析。任何时候,栈中都是基本变量或者对象引用,按部就班执行就行了。
ps:此图为转载
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156817.html原文链接:https://javaforall.cn