当前位置: 首页 > article >正文

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识
    • Java 生态圈
    • Java 跨平台的语言
      • Java 虚拟机规范
      • JVM 跨语言的平台
      • 多语言混合编程
      • 两种架构
        • 举例
    • JVM 的生命周期
      • 虚拟机的启动
      • 虚拟机的执行
      • 虚拟机的退出
    • JVM 发展历程
      • Sun Classic VM
      • Exact VM
      • HotSpot
      • BEA 的 JRockit
      • IBM 的 J9

Java 生态圈

Java 是目前应用最为广泛的软件开发平台之一。随着 Java 以及 Java 社区的不断壮大,Java 也早已不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。

  • 作为一个平台:Java 虚拟机扮演着举足轻重的作用。
    • Groovy、Scala、JRuby、Kotlin 等都是 Java 平台的一部分。
  • 作为一种文化:Java 几乎成为了开源的代名词
    • 第三方开源软件和框架,如,Tomcat、Struts、MyBatis、Spring 等
    • 就连 JDK 和 JVM 自身也有不少开源的实现,如 OpenJDK、Harmony
  • 作为一个社区,Java 拥有全世界最多的技术拥护者和开源社区的支持,有数不清的论坛和资料。从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到 Java 的身影。其应用形式之复杂、参与人数之众也令人咋舌。

Java 跨平台的语言

Java 虚拟机规范

The Java Virtual Machine is the cornerstone of the Java platform. It is the component of the technology responsible for its hardware- and operating system-independence, the small size of its compiled code, and its ability to protect users from malicious programs.

The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction set and manipulates various memory areas at run time. It is reasonably common to implement a programming language using a virtual machine; the best-known virtual machine may be the P-Code machine of UCSD Pascal.

JVM 跨语言的平台

随着 Java 7 的正式发布,Java 虚拟机的设计者们通过 JSR-292 规范基本实现在 Java 虚拟机平台上运行非 Java 语言编写的程序。

Java 虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说,Java 虚拟机拥有语言无关性,并不会单纯地与 Java 语言“终身绑定”,只要其他编程语言的编译结果满足并包含 Java 虚拟机的内部指令集,符号表以及其他的辅助信息,他就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。

Java 跨平台的语言

源码跨平台和二进制跨平台

  • Java、C++、Rust 的区别
    • C/C++ 完全相信而且惯着程序员,让大家自行管理内存,可以编写很自由的代码,但一 不小心就会造成内存泄漏等问题,导致程序崩溃。
    • Java/Golang 完全不相信程序员,但也惯着程序员。所有的内存生命周期都由 JVM 运行 时统一管理。 在绝大部分场景下,你可以非常自由的写代码,而且不用关心内存到底是 什么情况。 内存使用有问题的时候,我们可以通过 JVM 来进行信息相关的分析诊断和 调整。 这也是本课程的目标。
    • Rust 语言选择既不相信程序员,也不惯着程序员。 让你在写代码的时候,必须清楚明白 的用 Rust 的规则管理好你的变量,好让机器能明白高效地分析和管理内存。 但是这样 会导致代码不利于人的理解,写代码很不自由,学习成本也很高。
多语言混合编程

Java 平台上的多语言混合编程正在成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。

试想一下,在一个项目之中,并行处理使用 Clojure 语言编写,展示层使用 JRuby/Rails,中间层则是 Java,每个应用层都将使用不同的编程语言来完成,而且,接口对每一层开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生 API 一样方便,因为他们最终都运行在一个虚拟机之上。

对于这些运行在虚拟机之上、Java 语言之外的语言,来自系统级的、底层的支持正在迅速增强,以 JSR-292 为核心的一系列项目和功能改进(如,Davinci Machine 项目、Nashorn 引擎、InvokeDynamic 指令、java.lang.invoke 包等),推动 Java 虚拟机从 Java 语言的虚拟机向多语言虚拟机发展。

两种架构

Java 编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。

具体来说两种架构之间的区别:

  • 基于栈式架构的特点
    • 设计和实现更简单,适用于资源受限的系统;
    • 避开了寄存器的分配难题:使用零地址指令方式分配;
    • 指令流中的指令大部分是零地址指令,其执行过程依赖于操作数。指令集更小,编译器容易实现;
    • 不需要硬件支持,可移植性更好,更好实现跨平台。
  • 基于寄存器架构的特点
    • 典型的应用是 x86 的二进制指令集:比如传统的 PC 以及 Android 的 Davlik 虚拟机;
    • 指令集架构则完全依赖硬件,可移植性差;
    • 性能优秀和执行更高效;
    • 花费更少的指令去完成一项操作;
    • 在大部分情况下,基于寄存器架构的指令集往往都是一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。
举例

同样执行 2+3 这种逻辑操作,其指令分别如下:

基于栈的计算流程(以 Java 虚拟机为例):

iconst_2 // 常量 2 入栈
istore_1
iconst_3 // 常量 3 入栈
istore_2
iload_1
iload_2
iadd     // 常量 2、3 出栈,执行相加
istore_0 // 结果 5 入栈

而基于寄存器的计算流程

mov eax,2  // 将 eax 寄存器的值设置为 2
mov eax,3  // 使 eax 寄存器的值加 3

代码演示一下

public class StackStruTest {public static void main(String[] a) {int i = 2 + 3;}
}cd chapter_01
javac StackStruTest.java
javap -v StackStruTest
Classfile /Users/yonghong/Coding/jvm/song/chapter_01/StackStruTest.classLast modified 2020-11-17; size 277 bytesMD5 checksum 9a7da6f68b8101238c5ab826d90154c5Compiled from "StackStruTest.java"
public class StackStruTestminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #3.#12         // java/lang/Object."<init>":()V#2 = Class              #13            // StackStruTest#3 = Class              #14            // java/lang/Object#4 = Utf8               <init>#5 = Utf8               ()V#6 = Utf8               Code#7 = Utf8               LineNumberTable#8 = Utf8               main#9 = Utf8               ([Ljava/lang/String;)V#10 = Utf8               SourceFile#11 = Utf8               StackStruTest.java#12 = NameAndType        #4:#5          // "<init>":()V#13 = Utf8               StackStruTest#14 = Utf8               java/lang/Object
{public StackStruTest();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 2: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=1, locals=2, args_size=10: iconst_5 // 直接返回了 51: istore_12: returnLineNumberTable:line 4: 0line 5: 2
}
SourceFile: "StackStruTest.java"

由于跨平台的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。优点是跨平台、指令集小,编译器容易实现;缺点是性能下降,实现同样的功能需要更多的指令。

时至今日,尽管嵌入式平台已经不是 Java 程序的主流运行平台了(准确来说是 HotSpot 虚拟机的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?

答:基于栈式架构的虚拟机跨平台、指令集小,编译器容易实现,在非资源受限的场景中也是可以使用的。

JVM 的生命周期

虚拟机的启动

Java 虚拟机的启动时通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的执行
  • 一个运行中的 Java 虚拟机有着一个清晰的任务:执行 Java 程序;
  • 程序开始执行时他才运行,程序结束时他就停止;
  • 执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的进程。
虚拟机的退出

有如下的几种情况:

  • 程序正常执行结束;
  • 程序在执行过程中遇到了异常或错误而异常终止;
  • 由于操作系统出现错误而导致 Java 虚拟机进程终止;
  • 某线程调用 Runtime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或者 halt 操作;
  • 除此之外,JNI(Java Native Interface)规范中描述了用 JNI Invocation API 来加载或卸载 Java 虚拟机时 Java 虚拟机的退出情况。

JVM 发展历程

Sun Classic VM
  • 早在 1996 年 Java 1.0 版本的时候,Sun 公司发布了一款名为 Sun Classic VM 的 Java 虚拟机,它同时也是世界上第一款商用 Java 虚拟机,JDK 1.4 时完全被淘汰。
  • 这款虚拟机内部只提供解释器。
  • 如果使用 JIT 编译器,就需要进行外挂。但是一旦使用了 JIT 编译器,JIT 就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。
  • 现在 HotSpot 内置了此虚拟机。
Exact VM
  • 为了解决上一个虚拟机问题,JDK 1.2 时,Sun 提供了此虚拟机;
  • Exact Memory Management: 准确式内存管理;
    • 也可以叫 Non-Conservative/Accurate Memory Management
    • 虚拟机可以知道内存中某个位置的数据具体是什么类型
  • 具备现代高性能虚拟机的雏形
    • 热点探测
    • 编译器与解释器混合工作模式
  • 只在 Solaris 平台短暂使用,其他平台上还是 Classic VM
    • 英雄气短,终被 HotSpot 虚拟机替换
HotSpot
  • HotSpot 历史
    • 最初由一家名为 Longview Technologies 的小公司设计
    • 1997 年,此公司被 Sun 收购;2009 年,Sun 公司被 Oracle 收购
    • JDK 1.3 时,HotSpot VM 成为默认虚拟机
  • 目前 HotSpot 占有绝对的市场地位,称霸武林
    • 现在使用比较多的 JDK 8、JDK 11中默认的虚拟机是 HotSpot
    • Sun/Oracle JDk 和 OpenJDK 的默认虚拟机
  • 从服务端、桌面端、嵌入式都有应用
  • 名称中的 HotSpot 指的就是它的热点代码探测技术
    • 通过计数器找到最具编译价值代码,触发即时编译或栈上替换
    • 通过编译器与解释器协同工作,在最优的程序响应时间与最佳执行性能中取得平衡
BEA 的 JRockit
  • 专注于服务器应用
    • 它可以不太关注程序启动速度,因此 JRockit 内部不包含解释器实现,全部代码都是靠即时编译器编译后执行
  • 大量的行业基准测试显示,JRockit JVM 是世界上最快的 JVM。
    • 使用 JRockit 产品,客户已经体验带了显著的性能提高(一些超过了 70%)和硬件成本的减少(达50%)。
  • 优势:全面的 Java 运行时解决方案组合
    • JRockit 面向延迟敏感型应用的解决方案 JRockit Real Time 提供以毫秒或微秒级的 JVM 响应时间,适合财务,军事指挥,电信网络的需要。
    • MissionControl 服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。
  • 2008年,BEA 被 Oracle 收购
IBM 的 J9
  • 全称:IBM Technology for Java Virtual Machine,简称 IT4J,内部代号 J9
  • 市场定位与 HotSpot 接近,服务端、桌面应用、嵌入式等多用途 VM
  • 广泛应用于 IBM 的各种 Java 产品
  • 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的虚拟机。
  • 2017左右,IBM 发布了开源 J9 VM,命名为 OpenJ9,交给 Eclipse 基金会管理,也称为 Eclipse OpenJ9

相关文章:

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识

Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识 Java 生态圈Java 跨平台的语言 Java 虚拟机规范JVM 跨语言的平台多语言混合编程两种架构 举例 JVM 的生命周期 虚拟机的启动虚拟机的执行虚拟机的退出 JVM 发展历程 Sun Classic VMExact VMHotSpotBEA 的 JRockitIBM 的 J9 …...

V103开发笔记1-20250113

2025-01-13 一、应用方向分析 应用项目&#xff1a; PCBFLY无人机项目&#xff08;包括飞控和手持遥控器&#xff09;&#xff1b; 分析移植项目&#xff0c;应用外设资源包括&#xff1a; GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等&#xff1b; 二、移植项目的基本…...

在 Spring Boot 项目中,bootstrap.yml 和 application.yml文件区别

在 Spring Boot 项目中&#xff0c;bootstrap.yml 和 application.yml 是两个常用的配置文件&#xff0c;它们的作用和加载顺序有所不同。以下是它们的详细说明&#xff1a; 1. bootstrap.yml 作用&#xff1a; bootstrap.yml 是 Spring Cloud 项目中的配置文件&#xff0c;用于…...

DeepSeek研究员在线爆料:R1训练仅用两到三周,春节期间观察到R1 zero强大进化

内容提要 刚刚我注意到DeepSeek研究员Daya Guo回复了网友有关DeepSeek R1的一些问题&#xff0c;以及接下来的公司的计划&#xff0c;只能说DeepSeek的R1仅仅只是开始&#xff0c;内部研究还在快速推进&#xff0c;DeepSeek 的研究员过年都没歇&#xff0c;一直在爆肝推进研究…...

Java进阶文件输入输出实操(图片拷贝)

Java进阶文件输入输出实操&#xff08;图片拷贝&#xff09; 把某个目录下的全部图片&#xff0c;全部拷贝到另外一个目录 package test; import domee.chapter6_7.B; import java.io.*; public class Ex10_10 { public static void main(String[] args) throws IOException { …...

Spring Boot统一异常拦截实践指南

Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中&#xff0c;异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括&#xff1a; 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...

LLM推理--vLLM解读

主要参考&#xff1a; vLLM核心技术PagedAttention原理 总结一下 vLLM 的要点&#xff1a; Transformer decoder 结构推理时需要一个token一个token生成&#xff0c;且每个token需要跟前序所有内容做注意力计算&#xff08;包括输入的prompt和该token之前生成的token&#xf…...

vscode软件操作界面UI布局@各个功能区域划分及其名称称呼

文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上&#xff0c;Visual Studio Code 是一个代码编辑器&#xff0c;其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…...

PyQt6/PySide6 的 QTreeView 类

QTreeView 是 PyQt6 或 PySide6 库中用于显示分层数据的控件。它适用于展示树形结构的数据&#xff0c;如文件系统、组织结构等。QTreeView 也是基于模型-视图架构的&#xff0c;通常与 QAbstractItemModel 的子类&#xff08;如 QStandardItemModel 或自定义模型&#xff09;一…...

一键开启/关闭deepseek

一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek&#xff0c;一键关闭Deepseek双击对应的bat&#xff0c;就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载&#xff1a;https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来&#xff0c;保存成bat文件&#xff0c;也可…...

单纯接入第三方模型就无需算法备案了么?

随着人工智能技术的快速发展&#xff0c;越来越多的企业开始接入第三方模型以提升自身业务能力。然而&#xff0c;关于算法备案的问题也引发了诸多讨论&#xff0c;尤其是单纯接入第三方模型是否需要备案这一问题&#xff0c;更是让不少企业感到困惑。 一、明确算法备案的主体…...

实现一个 LRU 风格的缓存类

实现一个缓存类 需求描述豆包解决思路&#xff1a;实现代码&#xff1a;优化11. std::list::remove 的时间复杂度问题2. 代码复用优化后的代码优化说明 优化21. 边界条件检查2. 异常处理3. 代码封装性4. 线程安全优化后的代码示例优化说明 DeepSeek&#xff08;深度思考R1&…...

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …...

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…...

使用 Swift 完成FFmpeg音频录制、播放和视频格式转换应用

使用 Swift 构建音频录制、播放和视频格式转换应用 在这篇博客中&#xff0c;我们介绍如何用ffmpeg在swift上实现音频录制、音频播放、通过ffmpeg命令实现视频格式转换 音频录制&#xff1a;通过 AVAudioRecorder 实现音频录制功能。音频播放&#xff1a;通过 AVAudioPlayer …...

Gitea+Gridea 创建个人博客

历史文档存档&#xff0c;该方法目前已经无法使用&#xff0c;部署方法可供参考 Gitea部分 1.关于Gitea Gitea 是一个面向开源及私有软件项目的托管平台&#xff0c;是全球最大的代码托管平台之一。它采用 Git 分布式版本控制系统&#xff0c;为开发者提供了代码托管、版本控…...

【Linux】一文带你入门了解线程和虚拟地址空间中页表映射的秘密(内附手绘底层逻辑图 通俗易懂)

绪论​ 每日激励&#xff1a;“努力去做自己该做的&#xff0c;但是不要期待回报&#xff0c;不是付出了就会有回报的&#xff0c;做了就不要后悔&#xff0c;不做才后悔。—Jack” 绪论​&#xff1a; 本章是LInux中非常重要的线程部分&#xff0c;通过了解线程的基本概念&am…...

js面试some和every的区别

1.基础使用 some和every 都是数组的一个方法let num [1,2,3,4,5,6] let flag1 num.some((item,index,array)> item > 2)let flag2 num.every((item,index, array)> item > 2)1.some 遍历判断中是符合条件的值 一旦找到则不会继续迭代下去 直接返回 2.every 遍历…...

缓存类为啥使用 unordered_map 而不是 map

性能考虑&#xff1a; std::unordered_map 是基于哈希表实现的&#xff0c;而 std::map 是基于红黑树实现的。对于查找操作&#xff0c;std::unordered_map 的平均查找时间复杂度是 O ( 1 ) O(1) O(1)&#xff0c;而 std::map 的查找时间复杂度是 O ( l o g n ) O(log n) O(l…...

ollama linux下载

实验室服务器&#xff08;A6000&#xff09;执行curl -fsSL https://ollama.com/install.sh | sh太慢了。 而sudo snap install ollama&#xff0c;容易爆cudalibrt.so12无法正常使用的bug。 发现 https://www.modelscope.cn/models/modelscope/ollama-linux 使用modelscope进…...

k8s服务发现有哪些方式?

在 Kubernetes 中&#xff0c;服务发现是指如何让应用程序在集群内互相找到并通信。Kubernetes 提供了多种服务发现的方式&#xff0c;适应不同的使用场景。以下是 Kubernetes 中常见的服务发现方式&#xff1a; 1. 环境变量&#xff08;Environment Variables&#xff09; 概…...

Flash Attention与Attention

原始Attention是&#xff1a; Flash Attention&#xff1a; 伪代码&#xff1a;4d&#xff08;分别代表Q\K\V\O&#xff09; Flash Attention2优化了...

vue 使用fetch-event-source 处理sse,实现ChatGpt逐字输出效果

1. 安装 npm install microsoft/fetch-event-source 2. 引用 import { fetchEventSource } from "microsoft/fetch-event-source"; 3. 使用 fetchEventSource(/api/chat, { method: POST,headers: {Content-Type: application/json,Accept: */*,Token: this.toke…...

JAVA进阶之线程

为神马有线程&#xff1f;这玩意儿在干嘛&#xff1f;&#xff1f;&#xff1f; 回答这个问题&#xff0c;就先要知道一点点计算机的工作方式。 总所周知&#xff0c;计算机有五部分&#xff1a;输入输出、计算器、存储器、控制器。而在计算机内&#xff0c;CPU、内存、I/O之…...

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...

C++ 中的 `string` 类型:全面解析与高效操作

C 中的 string 类型&#xff1a;全面解析与高效操作 在 C 中&#xff0c;string 类型是对字符数组的高级封装&#xff0c;它提供了大量内置函数&#xff0c;使得字符串的处理变得更为简便和高效。与 C 风格的字符数组不同&#xff0c;string 类型不仅自动管理内存&#xff0c;…...

go语言中的Stringer的使用

Go 语言中的 Stringer 是一个非常有用的接口&#xff0c;它在标准库的 fmt 包中定义。Stringer 接口允许类型定义它们的字符串表示方式&#xff0c;这在格式化输出时特别有用。让我们深入了解一下&#xff1a; Stringer 接口定义&#xff1a; type Stringer interface {Strin…...

Java入门进阶

文章目录 1、常用API 1.1、Math1.2、System1.3、Object1.4、Arrays1.5、基本类型包装类 1.5.1、基本类型包装类概述1.5.2、Integer1.5.3、int和String相互转换1.5.4、自动装箱和拆箱 1.6、日期类 1.6.1、Date类1.6.2、SimpleDateFormat类 1.6.2.1、格式化&#xff08;从Date到…...

【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)

搭建完全分布式高可用大数据集群(Scala+Spark) scala-2.13.16.tgzspark-3.5.4-bin-without-hadoop.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Spark的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/softwa…...

使用vLLM部署Qwen2.5-VL-7B-Instruct模型的详细指南

使用vLLM部署Qwen2.5-VL-7B-Instruct模型的详细指南 引言环境搭建安装vLLM安装依赖库下载模型启动vLLM服务器总结参考 引言 近年来&#xff0c;随着大规模语言模型&#xff08;LLM&#xff09;的快速发展&#xff0c;如何高效地进行模型推理成为了一个热门话题。vLLM作为一个专…...