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

这是一篇给Java小白看的JVM文章

文章目录

  • 前言
  • 从 Java 的跨平台特性说起
  • Java 跨平台的实现:JVM
    • JVM 的定义
    • 跨平台问题说明
    • 从编码到运行
  • JVM 已成为规范
  • JVM 的后续了解
  • 总结

前言

很多Java开发人员,还不清楚JVM是什么,就直接涉足JVM调优。

很多Java开发人员,说起JVM,只知道运行时数据区域(或称之为JVM内存布局或JVM内存结构)。

还有很多Java开发人员,在被问起:“你知道Java内存模型吗?”,答:“知道,Java内存模型分为方法区、堆、…”。

虽说“概念”这个词发明出来是为了方便交流和说明问题的,不用太过于较真。但是,答非所问就是你的不对了。

如果你属于其中一者,我劝你看完这篇文章。

本文就一个目的:认识JVM。

从 Java 的跨平台特性说起

认识JVM应该从哪里入手?

可以问自己几个问题,为什么有JVM?没有JVM会怎样?

Java编程语言设计的初衷就是要解决一个问题:程序员编写一次程序,可以在任何提供Java运行时环境的机器上运行

也就是Java语言的跨平台特性“一次编写,到处运行”。

这一点可以在Oracle官方提供的文档里证实

可能有些Java开发人员对跨平台特性不是很理解:“不应该就是编写一次到处运行吗?”。

当然不是,如果了解C、C++语言的,就知道,想要在不同平台上运行,需要分别编译,甚至重新编写。

当然,这是所有编程语言都存在的问题。原因下面有说明。

那么,Java是如何解决的?

Java 跨平台的实现:JVM

Java之所以能实现跨平台,离不开JVM的支持。

下面对此展开说明。

JVM 的定义

JVM,全称:Java Virtual Machine (Java 虚拟机)。

下面是官方对JVM的定义:

Java虚拟机是一种抽象的计算机。就像真正的计算机一样,它有一个指令集,并在运行时处理各种内存区域。

这个说明已经非常简单明了了。如果不理解的继续看下文。

跨平台问题说明

任何一个高级编程语言编写的程序,在最终执行前,都会被翻译成计算机可以理解的语言:机器码,也就是诸如0101的二进制数。

在这里插入图片描述

这些机器码就是指令的实际表示,计算机的工作原理就是通过执行这些指令来完成具体的任务。
(每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址去等步骤)

而同一个操作,在不同的平台,指令可能会有所不同。

例如,“将数据从内存加载到寄存器”的操作,在x86架构和ARM架构中,指令就不一样:

  • 在x86架构中,可能会使用MOV指令将数据加载到寄存器EAX中:
MOV EAX, [0x12345678]
  • 在ARM架构中,可能会使用LDR指令将数据加载到寄存器R0中:
LDR R0, [0x12345678]

所以,在一个平台上编写的程序要在其他平台上运行,就需要重新编译,甚至重写。否则就会出现下图现象。

这也正是跨平台问题存在的根本原因。

从编码到运行

而JVM作为一个抽象的计算机,对外提供了一套自己的指令集,作用何在?

作用是:在不同平台运行符合自己指令的程序时,会将该指令转换成当前机器的本地指令。

这样就避免了多次编译的操作,从而实现“一次编写,到处运行”。

或者这样理解:JVM替代了多次编译的工作。

那么,符合自己指令的程序是什么呢?

没错,就是Java字节码(class文件)。

我们平时在编写完.java源码后,会经过JDK提供的编译工具(javac)编译为.class,而.class文件里面的内容就是JVM指令。

在这里插入图片描述

JVM 已成为规范

可能会有人有疑问,“为什么javac不直接编译成机器码?”

三个方面回答这个问题:

  1. 如果javac直接编译成机器码,就又回到跨平台的问题了。
  2. JVM除了解决跨平台问题外,还负责了内存管理和安全性的问题。
  3. 发展至今,JVM已经成为了一种规范,只要符合JVM规范,支持任何语言运行在JVM上。

在这里插入图片描述

JVM 的后续了解

通过上面的描述,如果理解了JVM是什么、JVM的作用或者JVM存在的意义,那就算是入门了。

如果激发了你对“JVM指令是什么”以及“它们如何被转换成机器指令”的好奇心,或者产生“类加载和JVM的关系”、“垃圾回收器和JVM的关系”等疑问。

那么,请关注我,后面的文章会带你一起了解。或者,自己可以去官方进行了解,官方文档链接给你放在这。

Java 各版本文档

Java语言&JVM规范文档

总结

最后总结一下本文内容:

  1. 所有高级编程语言编写的程序最终要翻译为机器码(指令的实际表示)才能被计算机理解。
  2. 由于计算机的硬件架构、操作系统不同,同一个操作指令可能也会不同。所以,程序要想在不同平台上运行,需要重新翻译或编写。
  3. Java最初是为了解决程序跨平台运行的问题,JVM正是实现跨平台特性的关键所在。
  4. Java语言编写的程序会被编译为Java字节码,也就是JVM自身的指令。运行时,JVM会将指令转换成本地机器指令,从而实现跨平台。
  5. JVM发展至今,已然是一个规范,已支持上百种编程语言。

当了解了JVM的作用、存在的意义,再去了解JVM的工作原理就不会那么困惑了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Diffusion Models/Score-based Generative Models背后的深度学习原理(7):估计配分函数
  • 【机器学习】——支持向量机
  • antd table 可展开行的多种控制
  • PS教程,从零开始学PS
  • css基础知识笔记
  • 告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件
  • [数据集][目标检测]中草药类型识别检测数据集VOC+YOLO格式7976张45类别
  • JVM 虚拟机的编译器、类加载过程、类加载器有哪些?
  • 信息技术的革新与未来展望
  • 面试金典题2.6
  • TLV解码 - 华为OD统一考试(E卷)
  • C++第十二节课 模板初阶和string引入
  • 新能源汽车知识点集萃
  • Invalid Object: LngLat(NaN, NaN)高德地图报错
  • 【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
  • 【刷算法】从上往下打印二叉树
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript新鲜事·第5期
  • js
  • OSS Web直传 (文件图片)
  • overflow: hidden IE7无效
  • PAT A1017 优先队列
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 高度不固定时垂直居中
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 收藏好这篇,别再只说“数据劫持”了
  • 延迟脚本的方式
  • 优秀架构师必须掌握的架构思维
  • 做一名精致的JavaScripter 01:JavaScript简介
  • nb
  • AI算硅基生命吗,为什么?
  • hi-nginx-1.3.4编译安装
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 容器镜像
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Lua:Lua调用C++生成的DLL库
  • #pragma data_seg 共享数据区(转)
  • #图像处理
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)(1.9) MSP (version 4.2)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (多级缓存)缓存同步
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (生成器)yield与(迭代器)generator
  • (正则)提取页面里的img标签
  • (转)C#调用WebService 基础
  • (转)创业的注意事项
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ***通过什么方式***网吧
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net(C#)中String.Format如何使用