Java的基础概念和常识(二)

news2024/10/10 9:11:59

什么是字节码?采用字节码的好处是什么?

字节码(Byte-code)是一种中间形式的代码,是源代码编译后生成的一种低级表示,通常是在编译阶段生成的。在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

一、字节码的定义

  1. 组成:字节码由一系列op代码/数据对组成,是一种二进制文件。
  2. 特性:字节码是一种中间码,它比机器码更抽象,可以被看作是一个执行程序的二进制文件或对象模型。
  3. 长度:字节码之所以被称为字节码,是因为通常每个opcode(操作码)是一字节长,但指令码的长度是变化的。每个指令有从0到255(或十六进制的00到FF)的一字节操作码,后面跟随参数,如寄存器或内存地址。
  4. 平台独立性:字节码独立于具体的硬件平台,可以在各种不同的架构上运行,如Java虚拟机(JVM)。

二、采用字节码的好处

  1. 跨平台性

    • 字节码可以在不同的操作系统和硬件上运行,因为只要存在相应的虚拟机(如JVM),编写的程序就能得到无缝执行。
    • 这使得开发者可以更方便地为多个平台开发应用程序,提高开发效率。
  2. 性能优化

    • 字节码可以在运行时动态编译为机器代码,避免了额外的编译步骤,同时保证了程序的执行效率。
    • 通过对字节码的直接操作,开发者可以在不改变源代码的基础上,对程序的执行性能进行显著提升。例如,通过移除未使用的代码(死代码消除)、减少方法调用的开销(内联)、优化循环结构等技术手段,可以显著提升程序运行速度和响应时间。
    • 虚拟机(如JVM)在运行字节码时可以进行即时编译(JIT),将频繁执行的字节码转换为本地机器代码,进一步提高程序的执行效率。
  3. 可调试性

    • 字节码是可读的,因此可以方便地进行调试和分析。
  4. 可扩展性

    • 字节码可以被扩展以支持新的特性,而不需要更改现有的机器代码。
  5. 安全性

    • 通过沙箱机制,虚拟机限制了字节码的直接操作,增强了系统的安全性。
    • 通过对字节码进行加密或混淆,可以有效地防止恶意用户对程序代码的分析和破解,保护软件知识产权和业务逻辑的安全。
    • 字节码级的安全检查和验证,例如动态的权限校验、运行时的数据流分析等,进一步提升了程序的安全防护等级。

综上所述,字节码作为一种中间形式的代码,在跨平台性、性能优化、可调试性、可扩展性和安全性等方面具有显著优势。这些优势使得字节码在软件开发和部署中发挥着重要作用。

Java程序从源代码到运行的过程:

Java程序从源代码到运行的过程,可以简单理解为以下几个步骤:

  1. .java 文件:
    这是你用Java编程语言编写的源代码文件。它包含了程序的指令、逻辑、数据声明等。

  2. javac 编译
    你使用Java编译器(通常叫做javac)来编译.java文件。编译器会检查你的代码是否有错误,然后将它转换成一种叫做字节码(bytecode)的中间形式。这个过程叫做编译(compilation)。

  3. .class 文件
    编译后的结果是一个或多个.class文件。这些文件包含了Java虚拟机(JVM)可以理解的字节码。字节码是一种介于高级编程语言和机器语言之间的中间代码。

  4. 解释器 & JIT
    当你运行Java程序时,JVM会读取.class文件中的字节码。JVM内部有两个主要的部分来处理这些字节码:

    • 解释器:它会逐条读取字节码指令,并将其翻译成当前机器的机器指令来执行。这个过程相对较慢,因为每条指令都需要被解释和执行。
    • 即时编译器(JIT, Just-In-Time Compiler):为了提高性能,JVM会在程序运行时动态地将热点代码(即经常被执行的代码)编译成机器码。这样,这些代码就可以直接由机器执行,而不需要每次都经过解释器的翻译。
  5. 机器可理解的代码
    最终,无论是通过解释器还是JIT编译器,Java程序的字节码都会被转换成当前计算机可以理解的机器指令来执行。这个过程使得Java程序能够在不同的硬件和操作系统上运行,而不需要为每个平台都编译一次代码。

所以,简单来说,Java程序从源代码到运行的过程就是:编写.java源代码文件 → 使用javac编译成.class字节码文件 → JVM通过解释器和JIT编译器将字节码转换成机器可理解的代码并执行。

我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(Just in Time Compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言

JDK、JRE、JVM、JIT 这四者的关系

  1. JDK 是 Java 程序开发的完整解决方案,包含了 JRE 和 JVM,以及开发 Java 应用程序所需的额外工具。
  2. JRE 是运行 Java 程序所必需的环境,包含了 JVM 和 Java 核心类库。
  3. JVM 是运行 Java 程序的核心组件,负责将 Java 字节码转换为特定平台的机器码并执行。
  4. JIT 是 JVM 的一个组成部分,用于在运行时动态优化 Java 程序的执行性能。

这四者之间的关系可以概括为:JDK 包含 JRE 和 JVM(以及开发工具),JRE 包含 JVM(以及核心类库),而 JIT 是 JVM 的一个优化机制。

为什么说 Java 语言“编译与解释并存”?

这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。

  1. 编译阶段
    • Java 源代码(.java 文件)首先通过 Java 编译器(javac)被编译成字节码(bytecode),生成字节码文件(.class 文件)。
    • 字节码是一种中间表示形式,既不是机器码也不是高级语言代码,而是一种介于两者之间的、平台无关的代码。
  2. 解释阶段
    • Java 虚拟机(JVM)是运行 Java 程序的平台。当 JVM 加载字节码文件时,它会逐条解释字节码指令,并将其转换为对应平台的机器码执行。
    • 这个过程被称为“解释执行”。不过,现代 JVM 通常包含即时编译器(JIT Compiler),它在运行时会将一部分热点代码(频繁执行的代码)编译成机器码,以提高性能。这种技术被称为“即时编译”(Just-In-Time Compilation)。
  3. 编译与解释的并存
    • Java 程序首先通过编译器编译成字节码,这是编译阶段。
    • 然后,JVM 解释执行这些字节码,同时利用 JIT 编译器将部分热点代码编译成机器码以提高性能,这是解释(及即时编译)阶段。
    • 因此,Java 语言在运行过程中既有编译过程(字节码到机器码的即时编译),又有解释过程(字节码的解释执行),两者并存。
  4. 平台无关性
    • Java 的这种编译与解释并存的机制还与其平台无关性密切相关。由于 Java 程序运行在 JVM 上,而 JVM 可以在不同的硬件和操作系统上实现,因此 Java 程序可以跨平台运行。
    • 编译阶段生成的字节码是平台无关的,而解释和即时编译阶段则发生在目标平台上,由 JVM 负责处理平台相关的细节。

Java 语言之所以被称为“编译与解释并存”,是因为其程序在执行过程中既涉及到了编译(字节码到机器码的即时编译),又涉及到了解释(字节码的解释执行)。这种机制使得 Java 程序既具有平台无关性,又能够在运行时获得较高的性能。

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

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

相关文章

K8s(学习笔记)

swap分区是什么呀? 什么是ipvs呀? yaml是什么呀??? p20看不下去了!!!

ansible 流程控制

目录 1.流程控制 2.handlers触发器 2.1使用handlers案例 3.when 判断 3.1 案例1 用于给task设置条件 满足或者不满足运行对应模块 3.2 案例2 如果系统是centos则安装sl,cowsay 如果是unbantu则安装cmatrix 4.循环 4.1案例 1.流程控制 hand…

飞腾CPU技术发展分析

飞腾CPU剖析 CPU:信创根基,国之重器 国产CPU市场呈现三大领军阵营:x86、ARM以及其他创新架构。鲲鹏与飞腾在ARM阵营中引领风潮,依托ARM技术授权研发高性能处理器;海光与兆芯则以x86架构为基石,深入挖掘其潜…

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)) 广度优先搜索理论基础bfs与dfs的对比(思维导图)&…

Spring Boot Starter Parent介绍

引言 spring-boot-starter-parent 是一个特殊的项目,为基于 Spring Boot 的应用程序提供默认配置和默认依赖。 在本 Spring Boot 教程中,我们将深入了解所有 Spring Boot 项目内部使用的 spring-boot-starter-parent 依赖项。我们将探讨此依赖项所提供…

基于jmeter+perfmon的稳定性测试记录

1. 引子 最近承接了项目中一些性能测试的任务,因此决定记录一下,将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内,有些特殊的部分。这部分的测试活动,与传统的测试任务差别是比较大的,也比较依赖…

用Python实现运筹学——Day 12: 线性规划在物流优化中的应用

一、学习内容 线性规划在物流优化中可以用于解决诸如配送路径优化、货物运输调度等问题。配送中心的路径优化问题本质上是寻找一条最优路径,在满足需求点的需求条件下,最小化配送的总运输成本或时间。常见的物流优化问题包括: 配送中心的货…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下,在线教育已成为教育领域的热门话题。而在众多在线教育平台中,集师知识付费小程序凭借其独特的定位和创新的模式,成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序,是一个集课程展示、…

Python 如何使用 Matplotlib 和 Seaborn 可视化数据

Python 如何使用 Matplotlib 和 Seaborn 可视化数据 一、简介 数据可视化是数据分析过程中非常重要的步骤。通过可视化,复杂的数据变得更直观,数据中的模式、趋势和异常可以更容易被识别。Python 提供了多个强大的库来进行数据可视化,其中最…

ChatGPT:引领人工智能新潮流!

一、ChatGPT 是什么? 1. ChatGPT 的强大功能和广泛应用。 ChatGPT 作为一款先进的 AI 语言模型,拥有众多强大功能。它可以进行文本生成、文本分类、情感分析、机器翻译等多种自然语言处理任务。同时,ChatGPT 还能进行对话式交互,…

python之详解集合

一种无序且不重复的数据容器,集合用大括号{}表示。 1、集合的查找访问 集合是不能通过 集合名[index] 这种方式访问的,其作用在于快速读取,而不是针对某个元素。 但,可将集合转为列表,再由列表访问元素。不过&#…

Laravel Filament 如何配置多语言支持

演示 一、安装拓展包outerweb/filament-translatable-fields composer require outerweb/filament-translatable-fields配置模型 该套件包含一个名为 HasTranslations 的特性,用于使 Eloquent 模型具备多语言功能。翻译值以 JSON 格式存储,并不需要额外…

叙说 OSI 七层网络模型 | 你在第几层

引言 开放系统互联(OSI,Open Systems Interconnection)模型,这一国际标准化组织(ISO)提出的理论框架,是计算机网络通信领域内不可或缺的基础工具。如同语法和句法对于构建和解析语言的重要性一…

Python对PDF文件页面的旋转和切割

Python对PDF文件页面的旋转和切割 利用Python的.rotate()方法和.mediabox属性对PDF页面进行旋转和切割,最终生成一个PDF。下面结合案例进行说明,本示例中的名为split_and_rotate.pdf文件在practice_files文件夹中, 示例(1&#…

ShardingSphere分库分表产品介绍

目录 一、ShardingSphere分库分表产品介绍 二、客户端分库分表与服务端分库分表 1、ShardingJDBC客户端分库分表 2、ShardingProxy服务端分库分表 3、ShardingSphere混合部署架构 三、分库分表,能不分就不分! 1、为什么要分库分表? 2、…

基于SpringBoot点餐系统【附源码】

基于SpringBoot点餐系统 效果如下: 系统首页界面 用户注册界面 美食信息页面 促销活动页面 管理员登录主页面 系统管理界面 订单管理界面 研究背景 随着互联网的迅猛发展和人们生活节奏的加快,传统的点餐方式已经无法满足现代消费者对快速、便捷服务的…

解决银河麒麟操作系统中无法通过管理员安装软件或运行有执行权限脚本的问题

解决银河麒麟操作系统中无法通过管理员安装软件或运行有执行权限脚本的问题 1、问题描述2、问题分析3、问题解决方法 💐The Begin💐点点关注,收藏不迷路💐 1、问题描述 在银河麒麟操作系统中,通过终端执行命令时&…

103页PPT | 智慧城市综合解决方案

智慧城市概况 PPT开篇介绍了智慧城市的发展历程,从2014年国家提出《国家新型城镇化规划(2014-2020年)》开始,到2017年提出从“智慧城市”到“新型智慧城市”的转变,再到2020年新型智慧城市建设取得显著成效。这一过程中&#xff…

3.1 显示层技术演变

文章目录 静态网站公共网关接口CGIServletJSPJSP模板引擎第三方模板引擎前后端分离Thymeleaf 今天我将与大家分享显示层技术的演变历程,以及它们在现代Web开发中的应用。 静态网站 首先,我们从静态网站开始。静态网站主要由HTML、CSS和JavaScript等静态…

JimuReport报表部署 | 升级 | 仪表盘集成 | 迁移其他项目 (图文讲解)

目录 前言1. 项目部署2. 项目升级3. 仪表盘集成3.1 配置类事项3.2 版本升级事项4. 迁移到ruoyi-vue-pro4.1 权限4.2 前端5. 彩蛋前言 以下针对Vue以及Java的项目 对于文中所说的nginx以及Java的相关知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(…