Java的结构与运行机制

1. JDK JRE JVM三者的区别

  • JDK(Java Development Kit):Java开发工具包

    JDK包含JRE,还包括其他例如:编译器(javac)、javadoc、jar等,JDK是能够创建和编译程序的。

  • JRE(Java runtime environment):Java运行环境

    JRE是运行已编译Java程序所需要的所有内容的集合,包括JVM,java类库,java命令和其他基础构建,JRE不能够创建和编译程序。

  • JVM(Java Virtual Machine):Java虚拟机

    JVM是运行java字节码1的虚拟机,JVM有针对不同系统的特定实现(这是因为不同操作系统二进制所代表的不完全相同),目的是使用相同的字节码,在不同的操作系统上都能给出相同的结果,如下图所示

    在这里插入图片描述

JDK、JRE、JVM三者之间的关系
在这里插入图片描述

Java文件在三者之间的流转
在这里插入图片描述

2. Java的运行机制(宏观)

  1. 编译:JDK调用javac工具将.java文件编译成.class文件
    如果在编译时该类所依赖的类还没有被编译则会自动编译所依赖的类并引用
    如果找不到所依赖的类则会报Can't found sysbol的异常

  2. 运行(启动JVM进程):
    类加载的生命周期:加载-->验证-->准备-->解析(验证、准备、解析称为类的连接)-->初始化-->使用-->卸载

    1. 加载:读取class文件到内存的过程

      • 加载.class文件
      • 将class文件的信息存储到方法区
      • 生成一个引用对象(java.lang.Class)
    2. 检验合格性:分为四个阶段
      格式验证:在加载阶段检查字节流是否符合class文件规范
      .class文件是否以魔数(Magic Number)0XCAFEBABE开头
      小版本号Minor version和大版本号Major version
      常量池中常量是否有不支持类型
      Constant_Utf8_info型的常量中是否有不符合UTF-8编码的数据
      class文件中各个部分及文件本身是否有被删除的或附加的其他信息
      ……
      元数据验证:进行字节码语义分析
      检查这个类是否有父类(除了java.lang.Object之外,所有的类都应该有父类)
      这个类的父类是否继承了不允许被继承的类(final修饰的类)
      如果这个类不是抽象类,是否实现了其父类或接口之中要求实现的所有方法
      类中的字段、方法是否与父类产生了矛盾(例如覆盖了父类的final字段,或者不符合规则的方法重载)
      ……
      字节码验证:通过数据流分析和控制流分析,确定程序语法是否合法,是否符合逻辑,是最复杂的验证阶段
      保证任意时刻操作数栈的数据类型与指令代码序列都能配合工作,例如不会出现类似于在操作栈上放置一个int类型的数据,使用时却是按long类型来载入本地的变量表中这样的情况
      保证任何跳转指令都不会跳转到方法体以外的字节码指令上
      保证方法体中的类型转换总是有效的,例如可以把一个子类对象赋值给父类数据类型,这是安全的,但是把一个父类对象赋值给子类数据类型,甚至把对象赋值给与它毫不相关的数据类型,这是危险的,不合法的
      ……
      符号引用验证:
      符号引用中通过字符串描述的全限定名是否能找到对应的类
      在指定的类中是否存在符合方法的字段描述符及简单名称所描述的方法和字段
      符号引用中的类、字段、方法的可访问性—检查权限,验证可被当前类访问
      ……
      由JVM校验.class文件是否符合规范,为了防止代码危害虚拟机本身以及底层系统

    3. 准备:类变量分配内存,在分配内存的过程中,类变量就有了默认值
      为类变量分配内存并设置类变量初始值(默认值,不是赋值),这些类变量所使用的内存全都在方法区进行分配(不包括实例变量:实例变量会在对象实例化随着对象分配到Java堆中)

    4. 解析:将class常量池内的符号引用替换为直接引用的过程
      符号引用:就是字符串,通过字符串中的信息就能直接找到对应的类的数据(只需要无分歧对应数据位置即可)
      直接引用:将符号引用转化为直接引用是因为直接引用是JVM虚拟机可以直接使用的,是虚拟机可读的地址信息,是直接指向目标的指针,不同的JVM虚拟机解析出来的直接地址是不同的,一旦出现直接地址就意味着该目标已经存在于内存中
      如果符合规范就通过类加载器加载到JVM中运行得出结果

    5. 初始化:按照程序代码进行初始化,对数据进行赋值
      类的执行
      JVM主要是在程序第一次运行时,不得不使用类的时候才会立即加载并生成一个java.lang.Class对象,并存在方法区,且只加载一次,这就是为什么实例变量和静态方法只执行一次的原因,执行代码的过程是JVM解释.class文件给操作系统的过程
      注意:.class文件并不能直接与操作系统进行交互,而是通过JVM这个中间层间接与操作系统进行交互
      仅有JVM是不能解释.class文件的,必须是jvm通过调用一个lib类库,而jre就包含这个lib类库

Java的main方法为什么这么写

  1. public:设置访问权限,因为main方法被作为一个主方法,需要且必须被直接访问

  2. static:在JVM中没有实例化main所在的类,而是直接通过类名.main()的方式进行调用的,所以如果不写staticJVM就无法访问到main方法

  3. void:main方法不能有返回值,因为,jvm就算接收到返回值,它返回给谁?所以main中不能存在返回值,包括所有直接对接到JVM层的方法都不能有返回值

  4. String[] args:是用于在main方法执行前接收命令行参数的,作用主要是开发过程无数据情况下以命令行数据进行测试,作用效果不大,但是是规定

JVM在将类字节码读到内存中后,会找到加载的类中的主类,然后在主类中找到main方法之后,将main线程压栈到线程栈中执行main方法

new对象的底层存储

以Hello hello=new Hello()为例

  1. 对象声明:Hello hello
    中开辟一个地址空间,用于存放声明的对象

  2. 创建对象:new Hello()
    1)申请内存空间,将Hello类的相关信息(实例变量,实例方法等)加载到堆内存中
    2)执行构造方法就是<init>方法

  3. 使声明的对象与堆内存中的信息产生关联:
    即将堆内存中的地址赋值给栈中声明的对象,由声明的对象携带这个地址指向堆内存对象信息

堆内存中开辟对象的结构是什么?

  1. 头部信息
    1)偏移值(对齐填充)
    2)持有指向方法区的指针
    3)描述信息(持有当前对象锁的线程id和持有对象锁线程的个数,在GC中存活的生命周期,偏向锁2的标志)
  2. 实例信息
    实例信息为对象的属性和行为,后续会进行详细的解释,目前可以理解为:你定义的类的信息会加载到堆内存中的实例信息部分

  1. JVM能理解的代码就叫做字节码,文件以.class结尾,不面向任何特定的处理器,只面向JVM虚拟机通过字节码的方式,Java语言成功解决了传统解释型语言执行效率低的问题,同时保留了解释型语言可移植的特性虽然执行效率低于C/C++等语言,但是在切换操作系统的情况下,字节码文件无需重新编译,即可运行。 ↩︎

  2. 什么是偏向锁:当线程已经对此对象加锁后,执行完毕,如果下一次访问该线程也是上一次的线程,那么不对此线程重新上锁 ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

逻辑分析仪 - 采样率/采样深度

采样深度&#xff08;Sampling Depth&#xff09; 采样深度指的是逻辑分析仪在一次捕获过程中可以记录的最大样本数量。简单来说&#xff0c;采样深度越大&#xff0c;逻辑分析仪可以记录的数据量就越多。这对于分析长时间的信号变化或复杂的信号序列非常重要。 采样率&#…

java面试(JVM)

JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM由哪些部分组成&#xff0c;运行流程是什么 什么是程序计数器 程序计数器…

uniapp微信小程序解决type=“nickname“获取昵称,v-model绑定值为空问题!

解决获取 type"nickname"值为空问题 文章目录 解决获取 type"nickname"值为空问题效果图Demo解决方式通过表单收集内容通过 uni.createSelectorQuery 效果图 开发工具效果图&#xff0c;真机上还会显示键盘输入框 Demo 如果通过 v-model 结合 blur 获取不…

Python数据分析实验四:数据分析综合应用开发

目录 一、实验目的与要求二、主要实验过程1、加载数据集2、数据预处理3、划分数据集4、创建模型估计器5、模型拟合6、模型性能评估 三、主要程序清单和运行结果四、实验体会 一、实验目的与要求 1、目的&#xff1a; 综合运用所学知识&#xff0c;选取有实际背景的应用问题进行…

YOLOv8_pose训练流程-原理解析[关键点检测理论篇]

本篇将介绍一下YOLOv8关键点检测网络的训练流程,同样在看此篇文章之前先去看一下预测流程[YOLOv8_pose预测流程-原理解析[关键点检测理论篇],还有目标检测任务的训练流程YOLOv8训练流程-原理解析[目标检测理论篇] ,这两篇都是前置课程,下图是YOLOv8实例分割的网络结构图。 …

C语言笔记22 •结构体•

C语言结构体 1.结构体类型的声明 struct Stu { char name[ 20 ]; // 名字 int age; // 年龄 char sex[ 5 ]; // 性别 char id[ 20 ]; // 学号 }; 2.结构体变量的创建和初始化 #include <stdio.h>// 定义一个结构体类型 Point struct Point {int x;int y; };i…

pikachu-Unsafe Filedownload

任意点击一个图片进行下载&#xff0c;发现下载的url。 http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filenamekb.png 构造payload&#xff1a; 即可下载 当前页面的源码&#xff0c;可以进行路径穿越来下载一些重要的配置文件来获取信息。 http://127.0.…

【PostgreSQL001】比较开发生产2个数据库结构方法

1.一直以来想写下基于PostgreSQL的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下PostgreSQL数据库相关知识体系。 3.欢迎批评指正&#xff0c;欢迎关…

【Mac】MWeb Pro(好用的markdown编辑器) v4.5.9中文版安装教程

软件介绍 MWeb Pro for Mac是一款Mac上的Markdown编辑器软件&#xff0c;它支持实时预览&#xff0c;语法高亮&#xff0c;自动保存和备份等功能&#xff0c;并且有多种主题和样式可供选择。此外&#xff0c;MWeb还支持多种导出格式&#xff0c;包括HTML、PDF、Word、ePub等&a…

虚拟机启动Operating System not found找不到操作系统

错误信息 PEX-E51 No SHCP or proxyDHCP offers were received. PXE-M0F: Exiting Intel PXE ROM. Operating System not found解决方法1 到服务里面检查跟vmware相关的服务是否已经全部启动 如果服务怎么都无法启动&#xff0c;最简单的办法还是重装vmware 解决方法2 &#…

数据插值之朗格朗日插值(一)

目录 一、引言 二、代码实现 2.1 Lagrange插值求插值多项式&#xff1a; 代码解析&#xff1a; 1.vpa解释 2.ploy&#xff08;x&#xff09;解释: 3.conv&#xff08;&#xff09;解释 4.poly2sym()解释 2.2 Lagrange插值求新样本值和误差估计&#xff1a; 代码解析&…

容器化:ES和Kibana

1 缘起 最近在学习使用ES&#xff0c; 为了找一个功能强大的可视化工具&#xff0c;之前使用了ES-Head&#xff0c;可以满足学习需求。 闲暇时间又折腾了另一个工具Kibana&#xff0c; 分享如下。 Kibana优点&#xff1a; 用户友好性&#xff1a;Kibana提供直观易用的用户界面…

项目思考-编辑器

1、文本生成编辑器 2、图片合成编辑器&#xff08;未完待续&#xff09; 3、文字和图像版本的技术要点&#xff0c;区别&#xff08;未完待续&#xff09; 4、编辑器的人员配置考虑&#xff0c;技术难点分析&#xff08;未完待续&#xff09; 1、文本生成编辑器

【Python】 掌握 Flask 请求数据获取的艺术

基本原理 在Web开发中&#xff0c;Flask是一个用Python编写的轻量级Web应用框架。它被广泛用于快速开发简单的Web应用。当用户通过浏览器或其他客户端向服务器发送请求时&#xff0c;Flask需要能够接收和解析这些请求中的数据。这些数据可以是GET请求的查询字符串、POST请求的…

收集 VSCode 常用快捷键

快速复制行 Shift Alt ↑/↓ 都是往下复制行&#xff0c;区别是&#xff1a;按↓复制时光标会跟着向下移动&#xff0c;按↑复制时光标不移动。 向上/向下移动一行 Alt ↑/↓ 删除整行 Ctrl Shift KCtrl x 剪切快捷键在VSCode 可以直接删除一行 垂直编辑 Ctrl…

用于时间序列概率预测的蒙特卡洛模拟

大家好&#xff0c;蒙特卡洛模拟是一种广泛应用于各个领域的计算技术&#xff0c;它通过从概率分布中随机抽取大量样本&#xff0c;并对结果进行统计分析&#xff0c;从而模拟复杂系统的行为。这种技术具有很强的适用性&#xff0c;在金融建模、工程设计、物理模拟、运筹优化以…

HACL-Net:基于MRI的胎盘植入谱诊断的分层注意力和对比学习网络

文章目录 HACL-Net: Hierarchical Attention and Contrastive Learning Network for MRI-Based Placenta Accreta Spectrum Diagnosis摘要方法实验结果 HACL-Net: Hierarchical Attention and Contrastive Learning Network for MRI-Based Placenta Accreta Spectrum Diagnosis…

Linux驱动设备导论(1)

最近本人在学习Linux驱动&#xff0c;本系列教程是本人在一边学习&#xff0c;一边总结的系列教程&#xff0c;希望能够给很多刚学驱动小伙伴一些总结。 1.Linux设备分类 驱动针对的对象是存储器和外设&#xff0c;不是针对CPU&#xff0c;可以分为以下三大类&#xff1a; 1.…

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…

[国产大模型简单使用介绍] 开源与免费API

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 随着大模型技术蓬勃发展和开源社区越来越活跃,国内的大模型也如雨后春笋一般.这时,一些就会问了,有了llama3,Mistral还有Gemma等等,国外大厂接连发力,一些开源社区也会有一些不错的模型,国内怎么比?对一个人使用,oll…