Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源

在这里插入图片描述

源起

Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯·高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡树),最初的设计目标是用于智能化家电的编程环境,如电视机、电话、闹钟等家用电器的控制和通信。然而,由于这些智能化家电的市场需求并未如预期般高涨,Sun公司决定调整方向,将Oak语言重新开发和改造。

从Oak到Java

随着万维网(WWW)的迅速发展,Sun公司发现了Oak语言在网络应用上的潜力。他们重新开发了Oak语言,并将其改名为Java。Java这个名字来源于太平洋上一个盛产咖啡的岛屿,寓意着这种语言将像咖啡一样受到人们的喜爱和欢迎。

Java的正式发布

1995年,Sun公司正式发布了Java语言。这个被定位于网络应用的程序设计语言迅速吸引了业界的关注。由于其跨平台性、面向对象编程特性、自动垃圾回收机制以及丰富的API库等优点,Java语言迅速成为了软件开发行业中的重要一员。

归属到 Oralce

Java语言不断发展和完善。Sun公司后被Oracle收购, 推出了包括Java SE(标准版)、Java EE(企业版)和Java ME(移动版)在内的完整产品线,为各种应用场景提供了全面的解决方案。此外,Java还在游戏开发、嵌入式系统、桌面应用等领域得到了广泛应用。

Java的运行原理

Java的运行原理主要涉及编译、类加载、字节码执行和垃圾回收等过程。以下是Java代码从编写到运行的详细解释:

一、编写代码

开发者使用文本编辑器或集成开发环境(IDE)编写Java源代码,文件扩展名为“.java”。例如,一个简单的Java程序“HelloWorld.java”可能包含以下代码:

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}
}

二、编译代码

使用Java编译器(javac)将Java源代码编译成字节码。字节码是一种中间表示形式,保存在“.class”文件中。编译后的文件为“HelloWorld.class”。

三、类加载

类加载器负责将“.class”文件加载到Java虚拟机(JVM)中。Java虚拟机中的类加载器主要有以下几种:

  • Bootstrap Class Loader:加载核心Java类库(如rt.jar)。
  • Extension Class Loader:加载扩展库(如ext目录下的库)。
  • Application Class Loader:加载应用程序的类路径下的类。

加载后的字节码会经过校验器(Bytecode Verifier)的校验,确保字节码的正确性和安全性。校验过程包括:

  • 确保字节码不会违反Java语言规范。
  • 确保方法调用是合法的。
  • 确保类型转换是安全的。

四、字节码执行

JVM的执行引擎负责执行字节码。执行引擎包含解释器和即时编译器(JIT):

  • 解释器(Interpreter):逐行解释执行字节码。解释执行速度较慢,但启动快。
  • 即时编译器(Just-In-Time Compiler, JIT):将热点代码(频繁执行的代码)编译成本地机器码,提高执行速度。

五、垃圾回收

JVM中的垃圾回收器负责自动管理内存。垃圾回收器会在堆(Heap)中查找不再被引用的对象,并释放其占用的内存。垃圾回收算法主要包括:

  • 标记-清除(Mark-Sweep):标记可达对象,然后清除未标记的对象。
  • 复制算法(Copying):将存活的对象复制到新空间,清除旧空间的所有对象。
  • 标记-压缩(Mark-Compact):标记存活对象并压缩,消除碎片。

六、与其他语言交互

Java本地接口(JNI)允许Java与其他编程语言(如C/C++)进行交互。通过JNI,Java程序可以调用本地方法(native methods),实现与底层系统的交互。

七、Java运行的关键特性

  • 跨平台性:Java字节码是平台无关的,JVM在不同平台上提供相同的字节码执行环境。
  • 内存管理:JVM自动管理内存,使用垃圾回收机制提高内存使用效率。
  • 安全性:字节码校验和沙箱机制增强了Java应用程序的安全性。

综上所述,Java的运行过程是一个从源代码编写、编译成字节码、加载到JVM、执行字节码并自动管理内存的完整流程。Java的跨平台性、内存管理和安全性等特性使得Java程序能够在各种环境中高效、稳定地运行。

JRE,JDK和JVM 概念

  • JRE,Java Runtime Environment,Java运行时,是面向Java程序使用者,是Java的运行环境。
  • JDK,Java Development Kit:Java开发工具包,是面向开发人员使用的,提供了Java的开发环境和运行环境
  • JVM,Java Virtual Machine,Java虚拟机,是Java实现跨平台的最核心部分。

JDK包含JRE,JRE包含JVM。
所有的java程序会变编译成.class的类文件,在JVM上执行,但执行.class类文件时需要调用类库lib,lib存在于JRE中。

什么是JVM

JVM,全称Java虚拟机(Java Virtual Machine),是一个能够运行Java字节码的虚拟计算机。它并不是一种具体的硬件设备,而是一种基于计算机的软件系统,能够模拟硬件环境来执行Java程序。

JVM的主要职责包括:

  1. 加载:JVM通过类加载器子系统将Java类的字节码从磁盘加载到内存中。这个过程包括验证字节码的合法性,确保它符合Java语言的规范。

  2. 链接:链接过程将加载的类合并到JVM的运行时环境中。这包括将符号引用转换为直接引用,以便在运行时能够快速地找到和使用这些引用。

  3. 初始化:在初始化阶段,JVM为类的静态变量分配内存,并执行类中的静态代码块。这是类准备使用的最后一步。

  4. 执行:一旦类被加载、链接和初始化,JVM就可以开始执行其中的方法了。Java字节码是由JVM的解释器或即时编译器(JIT)执行的。解释器逐条解释字节码指令并执行它们,而JIT则会将热点代码(即频繁执行的代码)编译成机器码以提高性能。

除了执行Java程序外,JVM还提供了一系列的核心类库,这些类库提供了丰富的功能,如字符串处理、文件操作、网络通信等。这些类库使得Java程序能够轻松地实现各种复杂的功能。

此外,JVM还负责管理内存,包括为对象分配内存和回收不再使用的内存。垃圾回收机制是JVM的一个重要特性,它自动地管理内存,使得Java程序员无需手动释放内存。

JVM的跨平台性是其另一个重要的特性。由于JVM能够模拟硬件环境来执行Java程序,因此Java程序可以在任何安装了JVM的平台上运行,而无需对源代码进行任何修改。这使得Java程序具有极高的可移植性和兼容性。

Java SE、Java EE 和 Java ME

  • Java SE , Java2 Platform Standard Edition, 面向个人PC桌面应用程序开发。这个版本以前称为J2SE。包括:
  1. Java运行环境(Java Runtime Environment, JRE),包含基本类库,Java虚拟机,Applet组件等;
  2. Java开发工具包(Java Development Kit, JDK),是JRE的扩展集,包含Java编译器和调试器等;
  • JAVA EE, Java2平台企业版(Java2 Platform Enterprise Edition),主要面向复杂的企业级应用,基于JAVA SE。这个版本以前称为J2EE。
    Java EE 指定了一套规范,提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
  • JAVA ME , Java2平台微型版(Java2 Platform Micro Edition),主要是面向移动设备、嵌入式设备等的开发,基于Java SE。这个版本以前称为J2ME。

Java 和 Jakarta

一、定义与范畴

  1. Jakarta
    • Jakarta是一个Java生态系统中的命名空间,旨在为Java技术和规范提供一个开放、中立的基础。
    • 它由Java基金会的一个开放源代码项目组成,提供了一系列的规范和参考实现,例如Jakarta EE、Jakarta Persistence、Jakarta JSON、Jakarta Batch等。
  2. Java
    • Java是一门面向对象的编程语言,由Sun Microsystems(后被Oracle收购)开发。
    • 它具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。
    • Java平台包括Java SE(标准版)、Java EE(企业版,现已更名为Jakarta EE)和Java ME(微型版)等多个版本。

二、历史与背景

  1. Jakarta
    • 随着Java技术和规范的不断发展和演变,Java生态系统也在不断变化。为了跟上这种变化,Jakarta项目应运而生。
    • Jakarta项目提供了许多重要的Java技术规范和参考实现,为Java开发人员提供了重要的基础设施和工具。
  2. Java
    • Java语言自20世纪90年代问世以来,经历了多个版本的更新和升级。
    • 它最初是为了解决嵌入式系统上的跨平台问题而设计的,后来逐渐发展成为一种广泛应用于企业级应用开发、Web开发、移动应用开发等领域的编程语言。

三、关键组件与用途

  1. Jakarta
    • Jakarta EE(原Java EE)是企业级Java应用程序的一个规范和平台,由一系列的API和技术规范组成。
    • 它提供了常用的API和技术规范,如Servlet、JPA、JMS、JAX-RS等,帮助Java开发人员构建基于Web的企业级应用程序。
    • 除了Jakarta EE之外,Jakarta还涉及到许多其他的项目和规范,如Jakarta Persistence、Jakarta JSON、Jakarta Batch等。
  2. Java
    • Java语言本身提供了丰富的语法和特性,支持面向对象编程、泛型、异常处理、多线程等概念。
    • Java平台提供了JVM(Java虚拟机)、Java类库、开发工具等关键组件,支持Java应用程序的编译、运行和调试。
    • Java广泛应用于桌面应用开发、Web应用开发、分布式系统开发、嵌入式系统开发等领域。

四、命名空间与包名

  1. Jakarta
    • 在Java生态系统中,Jakarta作为命名空间出现,用于区分不同的Java技术和规范。
    • 例如,在Apache Tomcat 10.0.x版本中,由于Java EE的迁移,javax被替换成了jakarta。
  2. Java
    • Java语言使用javax等命名空间来组织类库和API。
    • 例如,在Java EE时代,javax.servlet、javax.websocket等包名被广泛应用于企业级应用开发。

五、总结

综上所述,Jakarta和Java在定义与范畴、历史与背景、关键组件与用途以及命名空间与包名等方面存在明显的区别。Jakarta是Java生态系统中的一个重要项目,提供了许多重要的Java技术规范和参考实现;而Java则是一门面向对象的编程语言,具有广泛的应用领域和丰富的生态系统



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

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

相关文章

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异,并支持文…

使用 Spring AI + Elasticsearch 让 RAG 变得简单

作者:来自 Elastic Laura Trotta 使用私人数据定制你的人工智能聊天机器人体验。 Spring AI 最近将 Elasticsearch 添加为向量存储,Elastic 团队为其提供了优化。我们很高兴展示使用 Spring AI 和 Elasticsearch 向量数据库(vector database&…

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是 8GB/16GB/32GB 等,那这些内存空间…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel(没有一次性将数据读取到内存…

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能,这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…

Linux中使用ping提示“未知的名称或服务”

Linux中使用ping提示“未知的名称或服务” 问题:在linux系统中使用ping、telnet命令提示“未知的名称或服务”或 bad address。以centos系统为例: 问题原因: 1、未安装ping服务 2、操作系统未设置DNS(尝试ping IP地址&#xff0…

【C++】深入解析 using namespace std 语句

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯什么是 std?💯using namespace std; 的作用💯为什么需要 std 命名空间?💯using namespace std; 的优缺点优点缺点…

Android音频框架总结

1、AudioFlinger:接收多个APP的数据,合并下发;是策略的执行者,例如具体如何与音频设备通信,如何维护现有系统中的音频设备,以及多个音频流的混音如何处理等等都得由它来完 成。 AudioFlinger主要包含3个主…

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置(构建后发送邮件) 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题?最近遇到挺多工业相机维修咨询这个不能触发拍照的案例,所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…

68000汇编实战01-编程基础

文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…

wsl2的Ubuntu18.04安装ros和anaconda

参考:超详细 WSL2 安装 ros 和 anaconda_wsl2安装anaconda-CSDN博客 一.安装ros 1. 更换系统源 输入 wget http://fishros.com/install -O fishros && . fishros 和上面的链接一样,依次输入5-2-1 2. 安装ros 输入 wget http://fishros.c…

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间

如何为 ext2/ext3/ext4 文件系统的 /dev/centos/root 增加 800G 空间 一、引言二、检查当前磁盘和分区状态1. 使用 `df` 命令检查磁盘使用情况2. 使用 `lsblk` 命令查看分区结构3. 使用 `fdisk` 或 `parted` 命令查看详细的分区信息三、扩展逻辑卷(如果使用 LVM)1. 检查 LVM …

【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)

🗺️博客地图 📍1、报错发现 📍2、原因分析 📍3、解决办法 📍4、测试结果 1、报错发现 装好了CentOS操作系统,使用ssh远程登陆CentOS,出现如下告警信息: bash: 警告:setlocale…

【数据结构】双向链表、单向循环链表、双向循环链表、栈、链栈

目录 一、双向链表 定义类和封装函数以及测试样例如下: 注意事项: 二、循环链表 单循环列表的类和函数封装如下: 注意事项: 三、双向循环链表 结点类和双循环链表的定义部分 函数封装之判空和尾插 双循环链表遍历 双循…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接(Cross)、内连接(Inner)、自然连接(Natural)、外连接(Outer) 2. ORDER BY to produce ordered output 3. 聚合函数(Aggregate Functio…

systemverilog约束中:=和:/的区别

“x dist { [100:102] : 1, 200 : 2, 300 : 5}” 意味着其值等于100或101或102或200或300其中之一, 其权重比例为1:1:1:2:5 “x dist { [100:102] :/ 1, 200 : 2, 300 : 5}” 意味着等于100,101,102或200,或300其…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识,不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代…

NFT Insider #157:The Sandbox 开启新一期 VoxEdit 比赛

市场数据 加密艺术及收藏品新闻 Artnames 项目上线,将用户姓名转化为个性化 NFT 艺术品 由知名数字艺术家 Arrotu 发起的生成艺术项目「Artnames」正式上线,利用区块链技术将用户姓名转化为独一无二的 NFT 艺术品。该项目于 11 月 14 日启动&#xff0…

计算机是如何工作的

1. 冯诺依曼体系 CPU 中央处理器: 进行算术运算和逻辑判断 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储) 输入设备: 用户给计算机发号施令的设备 输出设备: 计算机个用户汇报结果的设备 1)针对存储空间: 硬盘 > 内存 >> CPU …