JVM介绍

JVM的位置

在这里插入图片描述

JVM在架构中的位置,与操作系统交互,因此不需要设计CPU指令,但是要调用操作系统的底层接口。从上面往下看,高级编程语言,例如JAVA编译之后就生成字节码,符合JVM字节码规范的字节码文件JVM都可以进行翻译成指令,因此,JVM可以运行除Java以外的高级语言如Scala编译成的字节码。


JVM的整体架构

在这里插入图片描述

方法区和堆是由多线程共享的
虚拟机栈、本地方法栈和程序计数器是线程独有的
类装载器子系统的任务是将class文件转化成一个类对象

详细版
在这里插入图片描述

执行引擎细分来说一共包括三部分,解释器、JIT编译器和垃圾回收器
在这里插入图片描述

其中解释器和编译器将字节码翻译成机器码,JIT编译器为字节码中重复执行的代码块(热点代码)建立缓存,加速执行速度。

Java代码的执行流程

在这里插入图片描述

基于栈的指令集架构 和 基于寄存器的指令集架构

基于栈的指令集架构特点:

  • 基于栈指令集,设计与实现基于栈的入栈和出栈的操作,适用于资源受限的系统。嵌入式、机顶盒。
  • 栈的操作只针对与栈顶的方法进行操作,因此使用零地址指令方式分配,避开了寄存器的分配问题
  • 跨平台性、在性能低的设备上使用,指令集小,但是执行的指令多

基于寄存器的指令集架构特点:

  • 完全依赖与硬件,可移植性差
  • 优点是性能高
  • 花费更少的指令去完成一项操作
  • 基于一地址、二地址和三地址指令为主,而基于栈的指令集为零地址指令分配方式

反编译指令:javap -v ***.class

为什么hotspot虚拟机要使用基于栈的指令集架构

  1. 设计与实现上简单
  2. 在各种平台上都可以使用

JVM的生命周期

启动:
通过引导类加载器(bootstrap class loader)创建一个初始类来完成,这个类由虚拟机具体指定的
引导类加载器加载object类

执行:
一个运行中的java虚拟机具有一个清晰的任务
程序开始执行时虚拟机开始运行,程序执行结束虚拟机停止运行
执行一个程序的时候,实际执行的是一个叫Java虚拟机的进程

退出:
当程序运行结束时虚拟机退出
当程序出现错误并且未处理 虚拟机退出
操作系统出现错误导致虚拟机退出
代码中system.exit()、runtime.halt()方法导致虚拟机退出

各种虚拟机介绍

  1. Sun classic VM:第一款商用java虚拟机,只提供解释器,不提供JIT编译器,使用JIT即时编译器需要外挂,但是解释器和编译器只能二选一。执行效率比较低下,现在hotspot内置此虚拟机
  2. Exact VM:准确式内存管理,虚拟机可以知道内存中某个位置的数据具体是什么类型,编译器和解释器可以混合工作,同时探测热点代码,只在solaris系统上使用
  3. Hotspot虚拟机:在jdk1.3时,成为默认虚拟机,hotspot指的是它探测热点代码的探测技术
  4. BEA的JRockit:专注于服务端。
    • 不关注程序的启动时间,因此不包含解析器实现
    • 是最快的JVM
    • 在jdk8中整合了hotspot和JRockit上的优秀特性
  5. IBM的J9: 与hotspot类似
  6. KVM、CDC/CLDC Hotspot:KVM简单、轻量、高度可移植性。控制器、传感器、老人手机用KVM
  7. Azul VM、Liquid VM:高性能虚拟机,与某个硬件绑定,性能更好发挥,移植性低,Liquid虚拟机不需要依赖操作系统
  8. Zing VM
  9. Apache Harmony:
  10. Microsoft JVM和Taobao JVM:微软虚拟机为了让浏览器更好运行java程序。Taobao JVM基于openjdk hotspot vm优化的Java虚拟机
  11. Dalvik VM:应用与安卓系统,没有遵循java的虚拟机规范。不执行.class文件,执行.dex文件。采用寄存器的架构模型,不使用栈架构。安卓5.0使用提前编译ART VM替换Dalvik VM。
  12. Graal VM:跨语言的全栈虚拟机,可以为任何语言使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java虚拟机(JVM)内存模型是JVM用于管理Java程序运行时内存的一种机制。JVM将内存划分为不同的区域,每个区域都有自己的用途和生命周期。这些区域包括: 1. 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,它用于记录当前线程所执行的字节码指令地址。每个线程都有一个独立的程序计数器。 2. Java虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈是线程私有的,它用于存储Java方法执行时的局部变量、操作数栈、动态链接、方法出口等信息。 3. 本地方法栈(Native Method Stack):本地方法栈与Java虚拟机栈类似,但是它是为本地方法服务的。 4. Java堆(Java Heap):Java堆是Java虚拟机管理的内存中最大的一块。Java对象实例和数组都在堆上分配内存。堆是所有线程共享的一块内存区域。 5. 方法区(Method Area):方法区是用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 6. 运行时常量池(Runtime Constant Pool):运行时常量池是方法区的一部分,用于存放编译器生成的字面量和符号引用。 7. 直接内存(Direct Memory):直接内存不是JVM运行时数据区的一部分,但是它也可以被JVM所管理。在使用NIO(New IO)时,可以使用直接内存来提高IO性能。 以上就是JVM内存模型的主要区域。JVM内存模型的划分对于Java程序的运行和调优都非常重要。在实际开发中,需要根据具体情况调整JVM内存的配置,以达到更好的性能表现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值