学弟学妹们你连JVM虚拟机都搞不明白就不要想着去大厂实习了
Posted 益达学长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学弟学妹们你连JVM虚拟机都搞不明白就不要想着去大厂实习了相关的知识,希望对你有一定的参考价值。
JVM 管理系统内存并为基于 Java 的应用程序提供可移植的执行环境
Java 虚拟机是一个程序,其目的是执行其他程序。这是一个简单的想法,也是我们编码功夫最伟大的例子之一。JVM 打破了当时的现状,并在今天继续支持编程创新。
JVM 的用途
JVM 有两个主要功能:允许 Java 程序在任何设备或操作系统上运行(称为“一次编写,随处运行”原则),以及管理和优化程序内存。1995 年 Java 发布时,所有计算机程序都写入特定的操作系统,程序内存由软件开发人员管理。所以JVM是一个启示。
图 1: JVM 的高级视图
为 JVM 制定技术定义很有用,而且软件开发人员也有日常思考方式。让我们分解一下:
- 技术定义:JVM 是执行代码并为该代码提供运行时环境的软件程序的规范。
- 日常定义:JVM 是我们运行 Java 程序的方式。我们配置 JVM 的设置,然后在执行期间依靠它来管理程序资源。
当开发人员谈论 JVM 时,我们通常指的是在机器上运行的进程,尤其是服务器,它代表和控制 Java 应用程序的资源使用。将此与JVM 规范进行对比,后者描述了构建执行这些任务的程序的要求。
谁开发和维护 JVM?
JVM 被一些非常聪明的程序员广泛部署、大量使用和维护,包括企业和开源程序员。该OpenJDK的项目是Sun Microsystems的决定开源Java的后代。OpenJDK 一直延续到 Oracle 对 Java 的管理,如今大部分繁重的工作都由 Oracle 工程师完成。
JVM 中的内存管理
与正在运行的 JVM 最常见的交互是检查堆和堆栈中的内存使用情况。最常见的调整是调整 JVM 的内存设置。
垃圾收集
在 Java 之前,所有程序内存都由程序员管理。在 Java 中,程序内存由 JVM 管理。JVM 通过称为垃圾收集的过程来管理内存,该过程不断地识别和消除 Java 程序中未使用的内存。垃圾收集发生在正在运行的 JVM 中。
在早期,Java 因不像 C++ 那样“接近金属”而受到很多批评,因此速度也不快。垃圾收集过程尤其有争议。从那时起,各种算法和方法被提出并用于垃圾收集。通过持续的开发和优化,垃圾收集有了很大的改进。
“接近金属”是什么意思?
当程序员说一种编程语言或平台“接近金属”时,我们的意思是开发人员能够以编程方式(通过编写代码)管理操作系统的内存。理论上,程序员可以通过规定使用多少以及何时丢弃它来从我们的程序中榨取更多性能。在大多数情况下,将内存管理委托给像 JVM 这样的高度精炼的进程会比你自己做会产生更好的性能和更少的错误。
JVM 分为三部分
可以说JVM包含三个方面:规范、实现和实例。让我们考虑其中的每一个。
1.JVM规范
首先,JVM 是一种软件规范。JVM 规范以某种循环方式强调其实现细节并未在规范中定义,以便在实现时发挥最大的创造力:
“要正确实现 Java 虚拟机,您只需要能够读取class文件格式并正确执行其中指定的操作。”
JS Bach 曾经类似地描述过创作音乐:
“所要做的就是在正确的时间触摸正确的键。”
因此,JVM 所要做的就是正确运行 Java 程序。听起来很简单,甚至从外面看起来很简单,但这是一项艰巨的任务,尤其是考虑到Java 语言的强大功能和灵活性。
JVM 作为虚拟机
JVM 是一种以可移植方式运行 Java 类文件的虚拟机。作为虚拟机意味着 JVM 是底层实际机器的抽象——例如运行您的程序的服务器。无论实际存在什么操作系统或硬件,JVM 都会为程序在其中运行创建一个可预测的环境。然而,与真正的虚拟机不同,JVM 不创建虚拟操作系统。将 JVM 描述为托管运行时环境或进程虚拟机会更准确。
2. JVM 实现
实现 JVM 规范会产生一个实际的软件程序,它是一个 JVM 实现。事实上,有许多JVM 实现,既有开源的,也有专有的。OpenJDK 的HotSpot JVM是参考实现,并且仍然是世界上经过最彻底尝试和测试的代码库之一。HotSpot 也是最常用的 JVM。
几乎所有获得许可的 JVM 都是作为 OpenJDK 和 HotSpot JVM 的分支创建的,包括 Oracle 的许可 JDK。创建基于 OpenJDK 的许可分支的开发人员通常希望添加特定于操作系统的性能改进。通常,下载并安装 JVM作为Java 运行时环境(JRE)的捆绑部分。
3.一个JVM实例
在 JVM 规范作为软件产品实施和发布后,可以将其作为程序下载并运行。下载的程序是 JVM 的一个实例(或实例化版本)。
大多数时候,当开发人员谈论“JVM”时,我们指的是在软件开发或生产环境中运行的 JVM 实例。可能会说,“嘿 Anand,该服务器上的 JVM 使用了多少内存?” 或者,“我不敢相信我创建了一个循环调用,堆栈溢出错误使我的 JVM 崩溃了。这是一个新手错误!”
什么是软件规范?
软件规范(或规格)是人类可读的设计文件,它描述一个软件系统应如何操作。规范的目的是为工程师编写代码创建清晰的描述和要求。
在JVM中加载和执行类文件
我们已经讨论了 JVM 在运行 Java 应用程序中的作用,但它如何执行其功能呢?为了运行 Java 应用程序,JVM 依赖于 Java 类加载器和 Java 执行引擎。
JVM 中的 Java 类加载器
Java 中的一切都是一个类,所有 Java 应用程序都是从类构建的。一个应用程序可以包含一个类或数千个。为了运行 Java 应用程序,JVM 必须将已编译的 .class 文件加载到可以访问它们的上下文(例如服务器)中。JVM 依赖其类加载器来执行此功能。
该Java类加载器是JVM的一部分加载类到内存中,使它们可用于执行。类加载器使用诸如延迟加载和缓存之类的技术来使类加载尽可能高效。也就是说,类加载并不是(比如说)便携式运行时内存管理那样的史诗般的脑筋急转弯,因此这些技术相对简单。
每个 Java 虚拟机都包含一个类加载器。JVM 规范描述了在运行时查询和操作类加载器的标准方法,但 JVM 实现负责实现这些功能。从开发人员的角度来看,底层的类加载器机制通常是一个黑匣子。
JVM 中的执行引擎
一旦类加载器完成了加载类的工作,JVM 就会开始执行每个类中的代码。该执行引擎是JVM组件,用于处理此功能。执行引擎对于运行的 JVM 是必不可少的。事实上,就所有实际目的而言,它都是 JVM 实例。
执行代码涉及管理对系统资源的访问。JVM 执行引擎介于运行程序(需要文件、网络和内存资源)和提供这些资源的操作系统之间。
执行引擎如何管理系统资源
系统资源可以分为两大类:内存和其他一切。
回想一下,JVM 负责处理未使用的内存,而垃圾收集是执行该处理的机制。JVM 还负责分配和维护开发人员认为理所当然的引用结构。例如,JVM 的执行引擎负责获取newJava 中的关键字之类的东西,并将其转换为特定于操作系统的内存分配请求。
除了内存之外,执行引擎还管理用于文件系统访问和网络 I/O 的资源。由于 JVM 可跨操作系统互操作,因此这不是一项简单的任务。除了每个应用程序的资源需求外,执行引擎还必须响应每个操作系统环境。这就是 JVM 能够处理野外需求的方式。
JVM 演进:过去、现在、未来
GitHub 星标 115k+的 Java开发教程,超级硬核!
1995 年,JVM 引入了两个革命性的概念,此后成为现代软件开发的标准:“一次编写,随处运行”和自动内存管理。软件互操作性在当时是一个大胆的概念,但今天很少有开发人员会三思而后行。同样,虽然我们的工程先驱必须自己管理程序内存,但我们这一代人是在垃圾收集中成长起来的。
我们可以说 James Gosling 和 Brendan Eich 发明了现代编程,但在接下来的几十年里,成千上万的其他人已经完善并建立了他们的想法。尽管 Java 虚拟机最初仅用于 Java,但今天它已发展为支持多种脚本和编程语言,包括 Scala、Groovy 和 Kotlin。展望未来,很难看到 JVM 不是开发领域的重要组成部分的未来。
以上是关于学弟学妹们你连JVM虚拟机都搞不明白就不要想着去大厂实习了的主要内容,如果未能解决你的问题,请参考以下文章
学弟学妹们,如果这五道题逻辑思维题都不会,就不要出去面试大厂了
00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 7 条人生建议(建议收藏)
00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 8 条人生建议(建议收藏)