实习日记 07/30 day17 理解JavaWeb--理解JVM

JVM和操作系统原理

大学学的计算机基础知识都是很有用的,就像编译原理对应的是Javac,操作系统原理则对应的是JVM虚拟机,JVM是Java强大的可移植性基础,通过Java虚拟机让Java在不同的设备上都能大放光彩。
Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。
操作系统有五大功能作业管理、文件管理、存储管理、设备管理和进程管理
学习操作系统原理时大题主要考虑进程的并发,内存的管理还有文件的处理
学习JVM时也要着重考虑并发、自动内存管理和JavaIO。

在这里插入图片描述
JVM体系结构:

  1. 类加载器:在JVM启动时或者在类运行时将需要的class文件加载到JVM中
  2. 执行引擎:执行引擎是负责执行class文件中包含的字节码指令
  3. 内存区:将内存划分为若干个去模拟实际机器上的存储记录和调度功能
  4. 本地方法调用:调用C或者C++实现本地方法的代码返回结果

各组件的作用:首先通过类加载器将Java代码转化为字节码,运行时数据区再把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层操作系统,需要特定的命令器执行殷勤,将字节码翻译成底层系统指令,再交由CPU去执行,此过程需要用到本地库接口。

虚拟机如何执行代码

通常一个1程序从编写到执行会经历如下几个阶段:
源代码→预处理→编译器→汇编程序→目标代码→链接器→可执行程序
不管何种指令集都只有几种最基本的元素:加减乘除求余取模等。这些运算又可以分解成二进制位运算:与,或,异或等。这些运算又通过指令来完成,而指令的核心就是确定需要运算的种类和运算需要的数据,以及从哪里获取操作数,将运算结果存放到什么地方,这种不同的操作方式又划分为:一地址指令、二地址指令、三地址指令和零地址指令等n地址指令。这种不同的指令集会有对应的架构实现,例如JVM就是通过栈的架构实现。
个人理解:将计算机进一步抽象,假设计算机是一个盒子,能完成输入 1+1,机器返回2的过程。
首先是理解输入 1+1,又有一个翻译机,可以把1+1翻译为盒子能弄懂的指令。
盒子听懂指令,把1存储到一个地方(可能是寄存器也可能是栈,这俩区别一个虚拟一个实体本质上都是放东西的地方),把+运算分解成二进制运算,再将结果放入结果盒子中返回。

JVM为何选择基于栈的架构

JVM执行字节码指令是机遇栈的架构,也就是所有的操作数必须先入栈,然后根据指令中的操作码选择从栈顶弹出若干个元素进行计算然后压入栈中。在进行操作时栈的操作比寄存器的复杂的多,但JVM基于栈来设计可以保证与平台无关,也保证了指令的紧凑性。

自动内存管理机制

在这里插入图片描述

Java内存管理

执行引擎在执行一段程序时要存储一些东西,如操作码需要的操作数,或者操作码的执行结果。class类的字节码还有类的对象等信息。JVM实例中有一个方法区、Java堆、Java栈、PC寄存器和本地方法区。

方法区和Java堆是所有线程共享的,也就可以被所有的执行引擎实例访问。
每个新的执行引擎实例被创建时会为这个执行引擎创建一个Java栈和一个PC寄存器,如果当前正在执行一个Java方法,那么当前的Java栈中保存的是该线程中调用的方法,包括方法参数、方法的局部变量、方法的返回值以及运算的中间结果等。

public class TestTime {
    static Integer a=new Integer(1);
    public static void solution1(int a){
        a-=a;
        System.out.println(a);
    }
    public static void solution2(int a){
        a+=a;
        System.out.println(a);
    }

    public static void main(String[] args) {
        solution1(a);
        solution2(a);
    }
}

输出结果是0,1,2

区域:

程序计数器:每条线程都需要一个程序计数器,计数器记录的是正在执行的指令地址,如果正在执行的是Natvie的方法,这个计数器值为空

Java虚拟机栈:Java方法执行的内存模型,每个方法执行的时候,都会创建一个栈帧用于保存局部变量表,操作数栈,动态链表,方法出口信息等。一个方法调用的过程就是一个栈帧从VM栈入栈到出栈的过程。

本地方法区:与VM栈发挥发挥的作用的作用非常相似,VM执行Java方法五福,Native方法栈执行的是Native方法服务。

Java堆:此内存区域的唯一目的是存放对象实例

方法区:是各个内存所共享的内存空间,方法区主要存放被JVM加载的类信息、常量、静态变量、即时编译后的代码等数据。

对比Dalvik虚拟机

Dalvik虚拟机是设计用于Android平台的Java虚拟机,支持dex格式的Java应用程序的运行,Davik具有高效、简洁、节约资源的特点。Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象声明周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。
在这里插入图片描述
Java源文件经过Java编译器生成Java字节码文件,再经由DEX工具生成Dalvik字节码最后有Dalvik虚拟机运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值