JVM是什么

Fanly 2020-08-06 15:28:47
问答

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVMJava Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM

引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译。Java 语言使用 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

概述

Java 虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

Java 虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java 语言的可移植性正是建立在 Java 虚拟机的基础上。任何平台只要装有针对于该平台的 Java 虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

Java 虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种 API、优化技术等。Java 技术使同一种应用可以运行在不同的平台上。Java 平台可分为两部分,即 Java 虚拟机(Java virtual machine,JVM)和 Java API 类库。

体系结构

每个 Java 程序都离不开 Java 虚拟机,Java 程序的运行依靠具体的 Java 虚拟机实例。在 Java 虚拟机规范中,分

别用子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示出一个抽象化的虚拟机内部的抽象体系结构。

Java 虚拟机主要分为五大模块:类装载器子系统、运行时数据区、执行引擎、本地方法接口和垃圾收集模块。其中垃圾收集模块在 Java 虚拟机规范中并没有要求 Java 虚拟机垃圾收集,但是在没有发明无限的内存之前,大多数 JVM 实现都是有垃圾收集的。而运行时数据区都会以某种形式存在于每一个 JAVA 虚拟机实例中,但是 Java 虚拟机规范对它的描述却是相当抽象。这些运行时数据结构上的细节,大多数都由具体实现的设计者决定。

Java 虚拟机不是真实的物理机,它没有寄存器,所以指令集是使用 Java 栈来存储中间数据,这样做的目的就是为了保持 Java 虚拟机的指令集尽量的紧凑,同时也便于 JAVA 虚拟机在那些只有很少通用寄存器的平台上实现。另外,JAVA 虚拟机的这种基于栈的体系结构,有助于运行时某些虚拟机实现的动态编译器和即时编译器的代码优化。

必要性

Java 语言的一个非常重要的特点就是与平台的无关性。而使用 Java 虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入 Java 语言虚拟机后,Java 语言在不同平台上运行时不需要重新编译。Java 语言使用模式 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。

内存管理

(1)对于 Java 运行时涉及到的存储区域主要包括程序计数器、Java 虚拟机栈、本地方法栈、java 堆、方法区以及直接内存等等。对于每个部分,都有其使用的条件。程序计数器主要是取下一条指令,在 Java 里面主要是取下一条指令的字节码文件;Java 虚拟机栈主要是利用栈先进后出的特性存储局部变量表,动态链接等,主要包括堆内存和栈内存,对于程序员内存分析而言是特别重要的。本地方法栈与上边的栈基本作用差不多,只不过这里是为 Java 方法而服务。Java 堆是内存管理中最大的一块,所有的线程共享这一块内容,同时该部分也是垃圾收集器的主要区域。

(2)虚拟机的垃圾回收机制是完善的,动态内存分配和回收是比较成熟的,在内存管理机制中,大部分都不需要我们考虑内存回收,只有 Java 堆和方法区需要我们考虑处理内存问题。一般的对于内存回收首先就是判断某一个部分是生存还是死亡,主要是通过下面二种算法:

其一是引用计数算法,本算法实现简单,判定的效率也是比较高的,很多的软件都使用了该算法,但是主流的 Java 并没有选择该算法,核心的问题是该算法难以处理对象之间相互调用的问题。

其二是称可达性分析算法,该算法核心思想是依靠判断对象是否存活来实现的,本算法是通过一系列的 GC ROOTS 的对象作为起始点,采用搜索的算法遍历引用链,如果搜索过程中没有发现该节点,则认为该节点是不可达的,即可回收的,在 Java 里面,一般可以使用该算法处理问题。

特性

1、移植性

无论是 GC 还是 Hotspot 都可以用在任何 Java 可用的地方。比方说,JRuby 可以运行在其他平台上,Rails 应用就可以运行在 IBM 主机上的 JRuby 上,而且这台 IBM 主机运行的是 CP/CMS.实际上,由于 Java 和 OpenJDK 项目的开源,我们正在看到越来越多的平台的衍生,因此 JVM 的移植性也将越来越棒。

2、成熟

JVM 已有多年的历史,在过去的这些年里,许多开发者为它做出了许多贡献,使得它的性能一次又一次地提升,让 JVM 变得更加稳定、快速和广泛。

3、覆盖面

JRuby 和 JVM 上的其他语言项目已经被承认,一个例子是 invokedynamic specification(akaJSR292)。JSR 越来越配合新的语言,JVM 已不再是 Java 一个人定制规则。JVM 正在构建成为类如 JRuby 等项目的优良平台。还有一个 MLVM(multiple languageVM)项目,好比是新特性的清算机构,是一个许多企业应用的开发者试图添加应用的地方,而这些应用正是他们想在 JVM 中看到的。而且 JVM 开发者互相协作、彼此影响,无疑这有利于 JVM 新特性的诞生。这些细节都可以看到 JVM 正在关注开发者的需求,扩大他的覆盖面。

0个人收藏 收藏

评论交流

泪雪默认头像 请「登录」后参与评论
  1. 加载中..

相关推荐

  • Java 内存泄漏 Java memory leak

    如何检测Java内存泄漏

    检测Java内存泄漏可使用JVM参数监控内存使用,使用jmap工具或JMX生成堆转储文件,使用分析工具帮助分析堆转储文件,查找可疑对象,分析GC日志,审查代码,使用代码分析工具,编写单元测试,性能监控,重复测试,复杂情况利用专业工具等方法。
  • Java

    Java开发包JDK包含了什么内容

    Java开发包JDK包含了Java编译器javac,用于将源代码编译成字节码;Java虚拟机JVM,是运行所有字节码的平台无关的运行环境;Java运行时环境JRE;Java API类库,提供了编程的基本构建块。
  • OpenLiteSpeed NGINX Apache

    Web服务器软件有哪些

    Web服务器软件种类多样,适应不同需求。Apache常用且灵活,Nginx高性能,IIS适合Windows,LiteSpeed和OpenLiteSpeed提供性能和安全,Caddy自动HTTPS,Tomcat专注Java,Cherokee多功能,lighttpd轻量,Node.js构建实时应用。选择取决于项目需求,需考虑性能、安全和可维护性。
  • Jar 文件 jar file

    运行JAR包需要JDK吗

    要运行JAR包,不一定需要安装JDK。JRE是运行JAR文件所必需的环境,它包含了运行Java程序所需的虚拟机和类库,因此只要计算机上安装了JRE,就可以直接运行JAR文件,如果需要编译或修改JAR文件,则需要安装JDK。
  • Scala 语言 Scala language

    Scala语言适合干什么

    Scala是一种功能齐全的函数式编程语言,非常适合开发需要复杂数据转换和处理的应用,如数据分析、数据挖掘等领域;体式内置了Actor模型,使得它在处理并发和并行编程方面表现出色;同时在大数据处理,机器学习,微服务,Web开发都很适合。
  • jvm

    jvm是虚拟机吗

    JVM是虚拟机,他是Java Virtual Machine(Java 虚拟机)的缩写,是java运行环境的一部分,是一个虚构出来的计算机,它是通过在实际的计算机上仿真模拟各种计算机功能来实现的,JVM是用来解析和运行Java程序的。