Java程序运行机制
Java语言既具有编译型语言的特征,又具有解释型语言的特征,Java程序要经过先编译后解释两个阶段。
高级语言的运行机制
📍编译型语言
使用专门的编译器,针对特定的平台(移植性差),将高级语言的源代码一次性编译成机器码,所以生成的可执行程序可以脱离开发环境独立运行,且程序运行效率通通常较高。C、C++属于编译型语言。
📍解释型语言
使用专门的解释器,将高级语言的源代码逐行解释成特定平台的机器码并立即执行的语言。是代码在执行时才被解释器一行行动态解析和执行,而不是在执行之前就完成全部编译。可以认为,每次执行解释型语言的程序都需要通过解释器进行一次编译,所以不能脱离解释器独立运行,且程序运行效率通通常较低。JavaScript、Python属于解释型语言。
📍主要区别
编译型语言在一次性编译后即可在特定的平台运行,解释型语言是在运行期间才逐行进行编译。所以前者运行速度快(先前在哪个平台编译的,就在哪个平台运行),后者跨平台性好(在当前选定的平台一边编译一边运行)。
Java程序的运行机制和JVM
Java语言比较特殊,程序需要先经过编译步骤,但编译后并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(.class文件),这种字节码并不是可执行的,必须经过java特定平台的解释器来解释执行,生成特定平台的机器码。因此可以认为,Java既是编译型语言,也是解释型语言。
java程序的执行过程必须经过先编译、后解释两个步骤。
.java文件(javac编译)---> .class字节码文件(java解释执行【使用java虚拟机】) ---> 特定平台的机器码
Java语言里负责解释执行字节码文件的就是java虚拟机(JVM)。各个平台上的JVM是不相同的,但是这些JVM都向编译器提供相同的编程接口,编译器只需要面向虚拟机,生成虚拟机能理解的代码,最后由虚拟机来解释执行。

📍Java语言为什么能一次编译到处运行?
java不同的平台有不同的JVM。源代码是一次编译成字节码文件(*.class文件),再利用不同平台的JVM进行解释,所以能在各个平台执行,这也是java跨平台的原因

JDK JRE JVM
JDK是java标准版开发包,是一套用于开发java应用程序的开发包,包括Java编译器、Java运行时环境(JRE)以及常用的Java类库等。
JRE是Java运行时环境,是运行Java程序的必须条件,它包含了类加载器、字节码校验器、JVM等
JVM是Java虚拟机,用于解释与平台无关的字节码文件,生成特定平台的机器码
包含关系:JDK>JRE>JVM
一般来说,如果只是要运行Java程序,可以只安装JRE,但如果要开发Java程序,则需要安装JDK
安装JDK需要设置的环境变量
📍PATH环境变量
我们知道,java执行过程必须经过先编译、后解释,Java程序安装了JDK之后,我们尝试在命令行窗口输入java和javac命令,发现提示“不是内部或外部命令”。这是因为:
Windows操作系统根据Path(不区分大小写)环境变量来查找命令,Path环境变量的值是一系列路径,操作系统根据这些路径依次查找当前执行的命令,若命令不存在,则提示"不是内部或外部命令...”
Linux操作系统根据PATH(区分大小写)环境变量查找命令。

用户变量和系统变量的区别:用户变量只对当前用户有效,系统变量对所有用户有效,为减少自己所做修改影响其他人,可设置用户变量。不过如果用户变量和系统变量配置的路径中包含了同一个命令,优先执行系统变量的。
📍为什么是%JAVA_HOME%?
其实就是引用变量JAVA_HOME的值,方便动态切换jdk版本
📍为什么是bin目录?
java javac命令就存在jdk的bin目录里面
第一个Java程序
1、在记事本新建一个文本文件,输入如下代码
public class HelloWorld{public static void main(String[] args){System.out.println("hello world !");}
}2、编译生成字节码.class文件
命令学习:javac -d destdir srcFile
destdir表示生成的字节码放在哪里
命令执行:C:\Users\25426>cd Desktop
C:\Users\25426\Desktop>javac -d . HelloWorld.java
3、运行Java程序
📍需要先进入.class文件所在目录
📍然后输入运行命令
C:\Users\25426\Desktop>java HelloWorld
📍此时看到命令行窗口输出语句,也就是程序要求输出的语句,代表Java程序运行成功
hello world !
Java程序的基本规则
程序的组织形式
Java解释器规定,某个类必须包含main方法才能被解释器直接解释执行,main方法必须使用public static void来修饰,参数为String[] 类型,即Java虚拟机是从main方法开始解释执行的,main方法是Java程序的入口。
Java源文件的命名规则
📍扩展名必须是.java
📍文件名必须与public类的类名相同,因此java源文件只能有一个public类(一个源文件可以有多个类的,但只能有一个public)
Java9的G1垃圾回收器
内存泄漏:程序在申请内存后,无法释放已申请的内存空间,导致系统无法及时回收内存并且分配给其他进程使用。多次内存泄漏会导致内存溢出;
内存溢出:程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
Java语言存在着垃圾回收机制,能够及时回收无用内存,减少内存泄漏。
Java程序的内存分配与回收都是由JRE在后台自动进行的。JRE负责回收不再使用的内存,这称为垃圾回收机制(GC)。
当一个对象不再被引用时,JVM按照特定的垃圾回收算法来实现内存自动回收。
JVM无论使用哪种垃圾回收算法,一般都要做两件基本的事情:
📍跟踪有用的对象,确定无用的对象
📍回收无用对象的内存空间
垃圾回收的特点:
📍垃圾回收器只能回收内存资源,不能回收物理资源,如数据库连接、磁盘IO
📍垃圾回收的时机不可预知,可能是CPU空闲时,也可能是内存不够用时。即使调用gc()或者System.gc(),也只是建议系统进行垃圾回收,但不一定会执行。
📍垃圾回收的开销会影响程序性能
程序编写原则:不再需要的对象,不要引用它们,那么它的内存有机会被收回
后续在详细介绍......
相关文章:
Java程序运行机制
Java语言既具有编译型语言的特征,又具有解释型语言的特征,Java程序要经过先编译后解释两个阶段。高级语言的运行机制📍编译型语言使用专门的编译器,针对特定的平台(移植性差),将高级语言的源代码…...
LeetCode刷题------字符串
目录 LeetCode:344.反转字符串 LeetCode:541. 反转字符串II LeetCode:剑指Offer 05.替换空格 LeetCode:151.翻转字符串里的单词 LeetCode:剑指Offer58-II.左旋转字符串 LeetCode:28. 实现 strStr() …...
区块链技术与应用2——BTC-数据结构
文章目录比特币中的数据结构1. 区块链(block chain)2. 默克尔树(Merkle tree)3.哈希指针的问题比特币中的数据结构 1. 区块链(block chain) 哈希指针: (1)保存数值的位置…...
BiseNet v1论文及其代码详解
来源:投稿 作者:蓬蓬奇 编辑:学姐 BiSeNet v1说明: 文章链接:https://arxiv.org/abs/1808.00897 官方开源代码:https://github.com/CoinCheung/BiSeNet (本文未使用) 文章标题&am…...
(超详细)Navicat的安装和激活,亲测有效
步骤一:准备安装包 下载Navicat,我用的v15最好一致(私信可以发你安装包和注册码)步骤二:关闭杀毒软件,然后需要断掉网络(一定断网) 步骤三:一路next安装,安装…...
JDY-31蓝牙模块使用指南
前言 本来是想买个hc-05,这种非常常用的模块,但是在优信电子买的时候,说有个可以替代的,没注意看,买回来折腾半天。 这个模块是从机模块,蓝牙模块分为主机从机和主从一体的,主机与从机的区别就…...
【2023】华为OD机试真题Java-题目0211-租车骑绿道
租车骑绿道 题目描述 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、最大载重 M M M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m m m、...
leetcode: 3Sum
leetcode: 3Sum1. 题目描述2. 思考3. 解题3. 总结1. 题目描述 Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i ! j, i ! k, and j ! k, and nums[i] nums[j] nums[k] 0. Notice that the solution set must not contain …...
【Python学习笔记】26.Python3 输入和输出(2)
前言 本章节继续介绍Python的输入输出。 文件对象的方法 本节中剩下的例子假设已经创建了一个称为 f 的文件对象。 f.read() 为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。 size 是一个可选的数字类型的…...
vue项目第二天
项目中使用element-ui库中文网https://element.eleme.cn/#/zh-CN安装命令npm install element-ui安装按需加载babel插件npm install babel-plugin-component -Dnpm i //可以通过npm i 的指令让配置刷新重新配置一下项目中使用element-ui组件抽离文件中按需使用element ui &…...
Python爬虫零基础到进阶(课程说明)
Python爬虫零基础到进阶 课程介绍总结 学—练—问 跟着学、多做多练、不懂就问、坚持就是胜利! 作业 飞书布置,作业提交放到群里,老师批改。 代码量 python基础: 十一次课,学会python。环境安装(了…...
《C++ Primer Plus》第16章:string类和标准模板库(13)
复习题 考虑下面的声明: class RQ1{ private:char *st; // pointer to C-style string public:RQ1() { st new char [1];strcpy(st, "");}RQ1(const char * s) {st new char [strlen(s)1];strcpy(st, s);}RQ1(const RQ1 & rq) {st new char[strlen…...
材质笔记 - Simluate Solid Surface
光的行为 当光和物体相遇时,光会有三种行为:被物体反射、穿过物体(物体是透明或半透明的)或者被吸收。 高光反射和漫反射 高光反射(Specular Reflection)会在表面光滑且反光的物体上看到,比如镜…...
设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解
一. 值类型和引用类型 1. 前言 (1). 分类 值类型包括:布尔类型、浮点类型(float、double、decimal、byte)、字符类型(char)、整型(int、long、short等)、枚举(entum)、结构体(struct)。 引用类型:数组、字符串(string)、类、接口…...
ssm高校功能教室预约系统java idea maven
本网站所实现的是一个高校功能教室预约系统,该系统严格按照需求分析制作相关模块,并利用所学知识尽力完成,但是本人由于学识浅薄,无法真正做到让该程序可以投入市场使用,仅仅简单实现部分功能,希望日后还能…...
C语言学习笔记-强制类型转换
强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型…...
docker数据卷插件
在docker中,对接外部存储我们通常需要docker的数据卷插件。docker中简要可分为两类 docker卷插件和CSI插件,其中docker卷插件分为两个版本,旧版的传统插件(legacy plugin/non-managed plugin)和新版的托管插件(managed plugin)。下面分章节讨…...
第二章-线程(3)
线程一、线程的定义二、线程的实现一、线程的定义 线程: 线程是进程中的一个实体,是系统独立调度和分派的基本单位。 进程是资源的拥有者,线程是系统独立调度和分配的基本单位。 进程与线程的比较: 调度:线程调度快…...
C++学习记录——칠 类和对象(4)
文章目录1、const成员2、取地址及const取地址操作符重载3、构造函数续集1、初始化列表2、explicit关键字4、static成员5、匿名对象6、友元1.友元函数2、友元类7、内部类1、const成员 看一段代码 class A { public:void Print(){cout << _a << endl;} private:int…...
Python-项目实战--飞机大战-碰撞检测(8)
目标了解碰撞检测方法碰撞实现1.了解碰撞检测方法pygame提供了两个非常方便的方法可以实现碰撞检测:pygame.sprite.groupcollide()两个精灵组中所有的精灵的碰撞检测groupcollide(group1, group2, dokill1, dokill2, collided None) -> Sprite_dict如果将dokill…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
