【Java那些年系列-启航篇 03】JDK、JRE和JVM之间是什么关系?

作者名称:纸飞机-暖阳

作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见

文章专栏:Java那些年专栏

专栏介绍:本专栏涵盖了 Java SE从基础语法到面向对象编程,从异常处理到集合框架,从I/O流到多线程并发,再到网络编程和虚拟机内部机制等一系列编程要素

个人感慨:市面上关于JavaSE的学习路线或知识图谱很繁杂,学习起来比较费劲,Java知识体系非常庞大,刚接触阶段只需要关注部分重要的知识点基本可以入门,但是需要在Java这个领域或是行业深耕,还是需要时间以及精力慢慢沉淀,如今AI盛行,对于计算机从业者是冲击也是机遇,很喜欢的一句话:开始很难,但总比一直等待要强。

JavaSE详细学习路线图以及思维导图

【Java那些年系列-启航篇 01】史上最强JavaSE学习路线图 & 知识图谱

文章目录

    • JavaSE详细学习路线图以及思维导图
  • 【Java那些年系列-启航篇 03】JDK、JRE和JVM之间是什么关系?
    • 引言
    • 01 JDK:Java开发工具包
      • 1.1 JDK概念
      • 1.2 JDK组成
      • 1.3 JDK功能
    • 02 JRE:Java运行环境
      • 2.1 JRE概念
      • 2.2 JRE组成
      • 2.3 JRE功能
    • 03 JVM:Java虚拟机
      • 3.1 JVM概念
      • 3.2 JVM组成
      • 3.3 JVM功能
      • 3.4 JVM工作原理
      • 3.5 JVM优势
    • 04 JDK、JRE与JVM的关系
      • 4.1 定义与功能
      • 4.2 关系与层次
      • 4.3 作用与重要性
    • 05 JDK、JRE与JVM的相关命令
      • 5.1 JDK(Java Development Kit)
      • 5.2 JRE(Java Runtime Environment)
      • 5.3 JVM(Java Virtual Machine)

【Java那些年系列-启航篇 03】JDK、JRE和JVM之间是什么关系?

引言

Java Development Kit(JDK)是Java编程语言的心脏,为开发者提供了一个完整的开发环境,用于构建、测试、运行和调试Java应用程序。

01 JDK:Java开发工具包

1.1 JDK概念

Java Development Kit(JDK)是一个综合性的开发工具包,它为Java应用程序的开发提供了必要的工具、编译器、开发工具、库和运行时环境。JDK是Java开发者进行软件开发的基础平台,它包括了多个关键组件,每个组件都在Java开发过程中扮演着特定的角色 。

1.2 JDK组成

    1. Java编译器(javac)

Java编译器是JDK中的第一个关键组件,它负责将Java源代码(.java文件)转换成Java字节码(.class文件)。这些字节码文件可以在任何安装了Java虚拟机(JVM)的设备上运行。javac编译器支持多种编译选项,包括指定源代码和目标字节码的版本,以及进行错误检查和警告。

    1. Java虚拟机(JVM)

JVM是JDK的核心组件,它提供了一个虚拟的运行环境,使得Java程序能够在各种操作系统和硬件平台上执行。JVM负责加载字节码文件,执行它们,并管理内存分配和垃圾回收。这种跨平台的能力是Java语言受欢迎的重要原因之一。

    1. Java类库

JDK包含了大量的预定义类和接口,这些构成了Java标准版(Java SE)的类库。类库提供了丰富的API,涵盖了基础数据类型操作、集合框架、输入输出流处理、网络编程、多线程、安全性等多个方面。这些类库的设计遵循了面向对象的原则,使得开发者可以方便地重用和扩展现有的功能。

    1. 开发工具

JDK内置了一系列的开发工具,如javadoc用于生成API文档,jar用于打包类文件和相关资源,jdb用于调试等。这些工具帮助开发者进行代码的编译、运行、调试、打包和文档化,极大地提高了开发效率。

    1. 版本管理

JDK支持多个版本并存,允许开发者根据项目需求选择合适的JDK版本。随着Java语言和平台的发展,新版本的JDK会引入新的语言特性和API。Oracle公司定期发布JDK的新版本,并提供长期支持(LTS)版本,以确保稳定性和兼容性。

1.3 JDK功能

    1. 跨平台开发

JDK的设计使得Java程序具有极高的跨平台兼容性。开发者可以在Windows、Linux、macOS等操作系统上使用相同的JDK开发Java应用程序,而无需担心平台相关的兼容性问题。

    1. 强大的类库支持

Java类库提供了丰富的功能,使得开发者可以快速实现各种复杂的功能,而无需从头开始编写代码。这些类库经过精心设计和优化,保证了性能和安全性。

    1. 安全性和稳定性

JDK提供了一系列的安全特性,包括访问控制、加密、安全通信等,以保护Java应用程序和数据的安全。Java安全架构包括沙箱模型,限制了应用程序对本地资源的访问,防止恶意代码的执行。

    1. 社区支持

JDK作为开源项目,得到了全球开发者社区的广泛支持。开发者可以通过参与OpenJDK项目来贡献代码、报告问题和改进JDK。社区的支持确保了JDK的持续发展和创新。

02 JRE:Java运行环境

2.1 JRE概念

Java运行环境(JRE)是运行Java应用程序的软件包,它提供了Java程序执行所需的全部软件环境。JRE包含了Java虚拟机(JVM)、Java核心类库以及一些支持Java程序运行的必要组件。它确保了Java程序能够在任何支持JRE的操作系统上运行,无需对代码进行任何修改。以下是JRE的详细描述,包括其主要组件、功能和在Java生态系统中的作用。

2.2 JRE组成

    1. Java虚拟机(JVM)

JVM是JRE的核心,它是一个虚拟机,负责执行Java字节码。JVM为Java程序提供了一个独立于硬件和操作系统的运行环境,这是Java语言“一次编写,到处运行”(Write Once, Run Anywhere)理念的基础。JVM不仅执行字节码,还管理程序的内存、垃圾回收以及确保程序的安全性。

    1. 核心类库

JRE包含了Java标准版(Java SE)的核心类库,这些类库提供了Java编程所需的基本功能。类库中包含了大量的预定义类和接口,涵盖了从基本数据类型操作、集合框架、输入输出(I/O)处理到网络编程和图形用户界面(GUI)等各个方面。这些类库是Java开发者可以依赖的丰富资源,大大简化了程序的开发过程。

    1. 支持文件

JRE还包括了一系列的支持文件,这些文件包括本地化支持、字体、协议处理等。这些文件对于Java程序的国际化和本地化至关重要,确保Java程序能够在不同的语言和文化环境中正常运行。

2.3 JRE功能

    1. 跨平台运行

JRE的设计使得Java程序可以在多种操作系统上运行,包括Windows、Linux、macOS等。这种跨平台的能力是Java语言的一大优势,使得开发者无需为不同的操作系统编写特定的代码。

    1. 内存和资源管理

JVM负责管理程序的内存分配和回收,这一过程对开发者来说是透明的。垃圾回收机制(Garbage Collection)可以自动回收不再使用的内存,减轻了开发者的负担,并提高了程序的性能。

    1. 安全性保障

JRE提供了沙箱(Sandbox)模型,限制了程序对本地资源的访问。这种安全机制防止了恶意代码的执行,保护了用户的系统安全。此外,JRE还提供了加密、安全通信等安全特性,确保数据的安全性。

    1. 国际化和本地化

JRE的支持文件使得Java程序能够适应不同的语言和文化环境。这包括对不同字符集的支持、日期和时间格式的本地化、货币和数字的格式化等。这些功能对于开发全球市场的产品至关重要。

03 JVM:Java虚拟机

3.1 JVM概念

Java虚拟机(JVM)是一个虚拟的计算机执行环境,用于执行Java字节码。JVM是Java运行时环境的一部分,它使得Java程序能够在任何安装了JVM的操作系统上运行,而不需要对代码进行修改。这种能力是Java语言“一次编写,到处运行”(Write Once, Run Anywhere)理念的基础。

3.2 JVM组成

    1. 类加载器(Class Loaders)

JVM使用类加载器来动态加载类文件。类加载器按照类的全限定名查找字节码文件,并将其加载到JVM内存中。这个过程是实现Java动态扩展性的关键。

    1. 运行时数据区(Runtime Data Areas)

JVM在执行Java程序时,会创建和管理一组运行时数据区域,这些区域包括:

方法区(Method Area):存储类结构,如运行时常量池、字段和方法数据。

堆(Heap):存储对象实例和数组。

栈(Stack):存储局部变量和方法调用的上下文。

程序计数器(Program Counter Register):存储当前线程执行的字节码指令地址。

本地方法栈(Native Method Stacks):支持本地方法(如C/C++编写的方法)的执行。

    1. 执行引擎(Execution Engine)

执行引擎是JVM的核心部分,它负责将字节码转换为机器码并执行。执行引擎有两种主要的工作模式:解释执行和即时编译(JIT)。

3.3 JVM功能

    1. 跨平台执行

JVM提供了一个与操作系统和硬件无关的运行环境,使得Java程序可以在任何支持JVM的平台上运行。这种特性使得Java成为了开发跨平台应用程序的理想选择。

    1. 内存管理

JVM自动管理程序的内存,包括对象的创建和垃圾回收。这减轻了开发者的负担,让他们可以专注于程序逻辑而不是内存管理。

    1. 加密安全

JVM提供了沙箱(Sandbox)安全模型,限制了程序对本地资源的访问。此外,JVM还提供了加密和安全通信的支持,确保了程序的安全性。

    1. 性能优化

JVM通过即时编译(JIT)和垃圾回收(GC)策略优化程序的性能。JIT编译器将热点代码(频繁执行的代码)编译为本地机器码以提高执行效率。垃圾回收机制自动回收不再使用的对象,优化内存使用。

3.4 JVM工作原理

    1. 编译

Java源代码首先被Java编译器(javac)编译成字节码,生成.class文件。这些字节码是平台无关的,可以跨操作系统和硬件平台运行。

    1. 加载

JVM中的类加载器(Class Loader)负责加载这些.class文件到JVM中。类加载器按照类的全限定名查找字节码文件,并将其加载到JVM内存中。

    1. 验证

加载后的字节码在执行前需要经过验证,确保字节码是有效的、格式正确的,并且不会违反JVM的安全限制。

    1. 执行

验证通过的字节码可以被JVM执行。JVM的执行引擎将字节码解释执行或通过即时编译器(JIT)将字节码编译为本地机器码再执行,以提高性能。

3.5 JVM优势

    1. 简化开发

由于JVM的跨平台特性,开发者只需编写一次代码,就可以在多个平台上运行,大大简化了开发过程。

    1. 提高代码可靠性

JVM的内存管理和异常处理机制确保了代码的可靠性。自动垃圾回收减少了内存泄漏的风险,异常处理机制使得错误更容易被发现和处理。

    1. 增强程序安全性

JVM的沙箱模型和安全特性保护了程序免受恶意代码的侵害。这为开发安全敏感的应用程序提供了坚实的基础。

    1. 性能与可维护性

JVM的性能优化技术,如JIT编译和垃圾回收,提高了程序的执行效率。同时,Java语言的面向对象特性和JVM提供的监控工具增强了程序的可维护性。

04 JDK、JRE与JVM的关系

JDK、JRE与JVM之间的关系可以分为以下几个关键点进行详细描述:

4.1 定义与功能

  • JDK(Java Development Kit):JDK是Java开发者的主要工具包,它包含了JRE(Java运行环境)以及Java开发工具,如编译器(javac)和调试器(jdb)等。JDK主要用于开发Java应用程序,它提供了编译、运行和调试Java程序所需的所有工具。
  • JRE(Java Runtime Environment):JRE是Java程序的运行环境,它包含了JVM(Java虚拟机)以及Java类库。JRE的主要作用是提供Java程序运行所需的运行时环境,使得开发者能够在不同的操作系统上运行Java程序。
  • JVM(Java Virtual Machine):JVM是Java程序的核心运行环境,它负责解释和执行Java字节码。JVM具有跨平台性,能够在不同的操作系统上运行相同的Java程序。

4.2 关系与层次

  • JVM与JRE的关系:JVM是JRE的核心组件,JRE包含了JVM以及Java类库。JVM提供了Java程序的运行环境,而Java类库则提供了丰富的功能和工具,使得开发者能够更方便地开发Java程序。
  • JRE与JDK的关系:JRE是JDK的一部分,JDK包含了JRE以及Java开发工具。JDK是开发Java程序的主要工具包,而JRE则是运行Java程序所必需的运行时环境。
  • 三者之间的层次关系:从层次结构上看,JDK是最顶层,它包含了JRE;而JRE又包含了JVM。这种层次关系体现了Java平台的构建原则,即“一次编写,到处运行”。

4.3 作用与重要性

  • JVM的作用:JVM是Java程序的核心运行环境,它负责解释和执行Java字节码。JVM的跨平台性使得Java程序能够在不同的操作系统上运行,而无需对代码进行任何修改。
  • JRE的作用:JRE提供了Java程序运行所需的运行时环境,包括JVM和Java类库。JRE使得开发者能够在不同的操作系统上运行Java程序,而无需关心底层操作系统的细节。
  • JDK的作用:JDK是Java开发者的主要工具包,它提供了开发Java程序所需的所有工具和库。JDK使得开发者能够更方便地编写、编译、调试和运行Java程序。

综上所述,JDK、JRE和JVM是Java平台的三个重要概念,它们之间的关系紧密而有序。JDK包含了JRE和Java开发工具,JRE包含了JVM和Java类库,而JVM则是Java程序的核心运行环境。这种层次关系使得Java程序能够在不同的操作系统上运行,而无需对代码进行任何修改,从而实现了“一次编写,到处运行”的目标。

05 JDK、JRE与JVM的相关命令

在命令行中,JDK(Java Development Kit)、JRE(Java Runtime Environment)和JVM(Java Virtual Machine)各自发挥着不同的作用,并提供了特定的命令来执行各种任务。

5.1 JDK(Java Development Kit)

编译和打包

  • javac:用于编译Java源代码文件(.java)为字节码文件(.class)。

    javac HelloWorld.java
    
  • jar:用于创建、查看或提取JAR文件。

    jar cvf HelloWorld.jar HelloWorld.class
    

调试

  • jdb:是Java的调试器,允许开发者在命令行中调试Java程序。

    jdb HelloWorld
    

文档生成

  • javadoc:从Java源代码中提取注释并生成API文档。

    javadoc HelloWorld.java
    

其他工具

  • javap:显示Java类文件中的信息,如字节码、本地变量表、行号表等。

    javap HelloWorld
    
  • jstack:生成Java线程堆栈跟踪,用于诊断线程问题。

    jstack [pid]
    

5.2 JRE(Java Runtime Environment)

执行Java程序

  • java:用于执行JAR文件或包含main方法的类。

    java -jar HelloWorld.jar
    

    java HelloWorld
    

JVM命令行选项

  • 可以通过java命令传递各种JVM选项来调整Java程序的运行配置,例如:

    java -Xmx512m -Xms64m HelloWorld
    

    上述命令设置了最大堆内存为512MB,初始堆内存为64MB。

5.3 JVM(Java Virtual Machine)

JVM参数和诊断工具

  • jps:显示指定系统内的所有Java虚拟机进程。

    jps
    
  • jinfo:显示Java虚拟机的配置信息,包括Java系统属性和JVM命令行参数。

    jinfo -flags [pid]
    
  • jstat:用于监视Java虚拟机各种运行状态信息,如类加载、垃圾收集、内存使用等。

    jstat -gc [pid]
    
  • jmap:生成Java堆转储映射文件,通常用于内存泄漏分析。

    jmap -dump:format=b,file=heap.bin [pid]
    
  • jhat:与jmap配合使用,分析堆转储文件。

    jhat heap.bin
    
  • jstack:生成Java线程的堆栈跟踪,用于诊断线程问题。

    jstack [pid]
    
  • jconsole:内置Java性能分析器,可以从命令行或在GUI shell中运行,用于监控Java应用程序性能和跟踪Java中的代码。

    jconsole
    

在命令行中使用这些工具和命令,开发者可以轻松地编译、运行、调试和监控Java程序。同时,通过调整JVM参数,还可以优化程序的性能和资源使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS2019中配置C++ OpenCV 4.5.4完整指南

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

STM32标准库ADC和DMA知识点总结

目录 前言 一、ADC模数转换器 (1)AD单通道 (2)AD多通道 二、DMA原理和应用 (1)DMA数据转运(内存到内存) (2)DMAAD多同道(外设到内存&#x…

堆排序(升)

堆排序(升) 堆排序是一种基于二叉堆数据结构的排序算法。它的主要想是将待排序的序列构建成一个大顶堆(或小顶),然后依次将堆顶元素与最后一个元素交换,并重新调整堆,使得剩余元素仍满足堆的性…

实习学习内容-Lua语法

Lua是一种轻量级的脚本语言,以其简单、灵活和高效的特点被广泛应用于嵌入式系统、游戏开发和服务器端编程中。Lua语言的设计目标是为了嵌入应用程序中,提供灵活的扩展和定制功能。下面,我将简要介绍Lua的基本语法和特点。 基本语法 变量和类…

24深圳杯数学建模挑战赛A题6页初步思路+参考论文+保姆级答疑!!!

问题1:单个残骸的精确位置定位 建立数学模型,分析如果要精准确定空中单个残骸发生音爆时的位置坐标(经度、纬度、高程)和时间,至少需要布置几台监测设备?假设某火箭一级残骸分离后,在落点附近布置了7台监测…

【热门话题】AI作画算法原理解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 AI作画算法原理解析AI作画算法概述基础原理:机器学习与深度学习卷积…

Bentley二次开发教程24-交互式类工具

交互式工具概念简述 本次内容主要涉及到交互式工具的使用,在MicroStation中,超过一半的功能都是以交互式工具的形式而存在的,因此交互式工具在MicroStation二次开发中便显得非常重要。当我们的鼠标或键盘在视图中产生交互操作时,…

黑马微服务课程2

课程地址:2024最新SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发(涵盖MybatisPlus、Docker、MQ、ES、Redis高级等)_哔哩哔哩_bilibili 课程名称:2024最新SpringCloud微服务开发与实战,java…

《A More Fine-Grained Aspect-Sentiment-Opinion Triplet Extraction Task》阅读笔记

一、论文简介 在自然语言处理(NLP)领域,情感分析一直是一个热门的研究主题,它帮助机器理解文本中的情感倾向。随着技术的进步,研究者们不断推动情感分析向更细粒度的方向发展,即从简单的正负情感判断&#…

【VueUse】重新定义状态管理在 Vue 中的体验

在 Vue 生态系统中,状态管理一直是开发者们关注的焦点之一。而随着 VueUse 的出现,我们迎来了一种全新的方式来处理状态管理,它让我们能够以更简单、更灵活的方式来管理应用程序的状态。 在本文中我们将深入探讨 VueUse 中与状态管理相关的内…

StrongSORT——基于DeepSORT,提高多目标跟踪的准确性和鲁棒性

1、概述 1.1 DeepSORT DeepSORT算法是在SORT基础上发展起来的一种多目标跟踪算法。SORT算法结合了目标检测器和跟踪器,其中跟踪器的核心是卡尔曼滤波和匈牙利算法。 卡尔曼滤波用于预测目标在下一帧的位置和状态而匈牙利算法则用于将预测状态与实际检测结果进行最…

SpringCloud基础 Consul的引入

前言 首先是为什么引入consul这个组件 我们知道微服务分为很多个模块,这里模块中相互调用,我使用硬编码的模式是不好的 比如微服务模块需要更新的时候,我们使用硬编码的方式可能需要修改很多个地方 但是使用consul之后,就引入了注册中心,我们只需要将对应的服务注册为节点 这样…

android脱壳第二发:grpc-dumpdex加修复

上一篇我写的dex脱壳,写到银行类型的app的dex修复问题,因为dex中被抽取出来的函数的code_item_off 的偏移所在的内存,不在dex文件范围内,所以需要进行一定的修复,然后就停止了。本来不打算接着搞得,但是写了…

【论文阅读】EgoPCA: A New Framework for Egocentric Hand-Object Interaction

论文主要贡献 提出一种新的框架:Ego-HOI recognition by Probing, Curation and Adaption (EgoPCA)。构建了全面的预训练集,平衡的测试集,以及一个包含了微调策略的baseline。 在Ego-HOI达到了SOTA,并且建立了有效的机制方法。 …

【后端】git与python的结合使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、git介绍二、git常见使用三、git与python的结合使用四、总结 前言 随着开发语言及人工智能工具的普及,使得越来越多的人会主动学习使用一些开发…

Python搭建http下载服务器

import http.server import socketserverPORT 8002Handler http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("serving at port", PORT)httpd.serve_forever()使用: 保存为httpserver.…

Python计算两个时间的时间差(工作笔记需要自取)

目录 专栏导读方法1:方法2总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章…

【OceanBase系列】—— 常用运维操作(备忘)

作者简介: 花名:绪宁,OceanBase 数据库解决方案架构师 创建租户 方法一:OCP 创建 确认可分配资源 具体可以分配多少内存,可以通过【资源管理】查看各节点的剩余资源 2. 新建租户 3. 填写租户信息 zone 优先级主要是 p…

STM32玩转物联网实战篇:5.ESP8266 WIFI模块MQTT通信示例详解

1、准备开发板 开发板功能区分布图 开发板俯视图 2、实验讲解 在之前的章节中,已经讲解过了MQTT的通讯原理和组包过程,现在开始手把手的教大家用代码来实现连接MQTT平台以及数据的交互,实际上这篇文章已经拖更接近两年了,非常…

golang调用阿里通义千问的接口

有的项目可能需要用到直接外部调用阿里通义千问的接口。官方只有python和java的sdk。 其实golang简单的调用也非常简单,就是一个封装的http调用,下面是具体的代码。 注意提前申请apiKey. package tongyiimport ("bytes""context"…