小白入门JVM、字节码、类加载机制图解

前提知识~

JDK 基本介绍

  1. JDK 的全称(Java Development Kit Java 开发工具包)
  2. JDK = JRE + java 的开发工具[java, javac,javadoc,javap 等]
  3. JDK 是提供给Java 开发人员使用的,其中包含了java 的开发工具,也包括了JRE。
  4. 可开发、编译、调试……

JRE 基本介绍

  1. JRE(Java Runtime Environment Java 运行环境)
  2. JRE = JVM + Java 的核心类库[类]
  3. 包括Java 虚拟机(JVM Java Virtual Machine)和Java 程序所需的核心类库等,如果只想运行开发好的.class 文件只需要JRE。也称最小运行环境。
  4. 只运行

JVM是什么?

  1. JVM(Java Virtual Machine,  Java虚拟机)

JVM有什么用?

与其他语言不同,Java 语言并不直接将代码编译成与系统有关的机器码,而是编译成一种特定的语言规范,这种语言规范我们称之为字节码。无论 Java 程序要在 Windows 系统,还是 Mac OSX 系统,或是 Linux 系统,它首先都得编译成字节码文件,之后才能运行。 

我们编译成字节码之后,无论但是 Linux 系统、 Windows 系统都还是不认识。                   

这时候 Java 虚拟机就是一个翻译官,解析字节码文件的内容,在 Linux 系统上翻译成 Linux 机器码给 Linux 系统听,在 Windows 系统上翻译成 Windows 机器码给 Windows 系统听。

实际上 Java 虚拟机运行的是字节码文件(Class文件),并不是Java代码

总结: Java 虚拟机是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。

JVM的内存结构:

首先先说虚拟机内存结构和运行时数据区两个说法是一个意思。

分为5 个:

 1.Java堆(Heap):

  1. 是内存中最大的一块
  2. Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建
  3. 作用:存放对象实例,几乎所有的对象实例都在这里分配内存。
  4. 有些时候小对象会直接在栈上进行分配,这种现象我们称之为「栈上分配」

Java 堆根据对象存活时间的不同,Java 堆还被分为年轻代老年代两个区域;年轻代还被进一步划分为 Eden 区、From Survivor 0To Survivor 1 区。

当有对象需要分配时,一个对象永远优先被分配在年轻代的 Eden 区,等到 Eden 区域内存不够时,Java 虚拟机会启动垃圾回收。此时 Eden 区中没有被引用的对象的内存就会被回收,而一些存活时间较长的对象则会进入到老年代。在 JVM 中有一个名为 -XX:MaxTenuringThreshold 的参数专门用来设置晋升到老年代所需要经历的 GC 次数,即在年轻代的对象经过了指定次数的 GC 后,将在下次 GC 时进入老年代。

Eden:S0 :S1 = 8:1:1 

2.方法区(Method Area):

  1. 作用:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
  2. 常量池其实是存放在方法区中的
  3. 方法区在不同版本的虚拟机有不同的表现形式,例如在 1.7 版本的 HotSpot 虚拟机中,方法区被称为永久代(Permanent Space),而在 JDK 1.8 中则被称之为 MetaSpace。

3.程序计数器(Program Counter Register):

  1. 是一块较小的内存空间
  2.  字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
  3. 每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储
  4. 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)

4.JVM栈(JVM Stacks):

  1. 与线程同时创建
  2. 每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。
  3. 每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
  4. 简单来说:执行 Java 代码

5.本地方法栈(Native Method Stacks) :

本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务

总结一下:一个 Java 文件就加载到内存中了,并且 Java 类信息就会存储在我们的方法区中。如果创建对象,那么对象数据就会存放在 Java 堆中。如果调用方法,就会用到 PC 寄存器、Java 虚拟机栈、本地方法栈等结构。


字节码:

前面我们知道了,在不同操作系统、不同硬件平台上都可以做到不用修改代码就可以运行,怎么实现的跨平台?中间码诞生了!即“字节码”!

Java所有的指令有200个左右,一个字节(8位)可以存储256种不同指令信息,一个这样的字节成为字节码。

那么,Java源代码是如何转成字节码的呢?如图:

 当字节码通过类加载到JVM环境后,才可以执行,而执行分为三种模式:

  1. 解释执行(javac编译器):启动快,运行慢
  2. JIT编译执行:启动慢,运行快
  3. JIT编译与解释混合执行(默认): 在启动时先解释执行,省去编译时间

解释器不需要像 JIT 编译器一样,将所有字节码都转化为机器码,所以就减少了时间。而JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。大家都知道,机器码的运行效率肯定是高于 Java 解释器的,所以我们会默认使用混合执行


类加载机制

程序三阶段:编译,加载,运行

JVM 虚拟机将字节码读取进内存,从而进行解析、运行等的这整个过程,我们叫:Java 虚拟机的类加载机制。(即第二阶段)

类加载阶段又可以细分为三个阶段,为加载Load,连接Link,初始化Init

  1. 加载 
  2. 连接
    1. 验证验证成员的安全性(更详细的校验,比如final是否合规、类型是否正确、静态变量是否合理)
    2. 准备将类中的静态成员初始化为默认值(为静态变量分配内存,设定默认值)
    3. 解析将间接地址转换为直接地址(将其在常量池中的符号引用替换成直接其在内存中的直接引用)
  3. 初始化

尾声

【JVM】从三种认知角度重识JVM-CSDN博客

 JVM入门教程第7讲:JVM 类加载机制 - 陈树义 - 博客园

jvm系列(二):JVM内存结构 - 纯洁的微笑 - 博客园

jvm系列(一):java类的加载机制 - 纯洁的微笑 - 博客园

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

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

相关文章

consul服务注册与发现(go)-学习笔记

参考博客 1、服务实例接口与默认实现 type ServiceInstance interface {// 获取服务实例的唯一IDGetInstanceId() string// 获取服务IDGetServiceId() string// 获取服务实例的主机名或IP地址GetHost() string// 获取服务实例的端口号GetPort() int// 判断服务实例是否使用HT…

【AI】prompt engineering

prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…

Python 字典和集合(常见的映射方法)

本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 常见的映射方法 映射类型…

对抗Prompt工程:构建AI安全护栏的攻防实践

大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例,揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理,提出融合动态意图拓扑分析(DITA)、对抗…

STL c++ list——模拟实现

结点类的模拟实现 list是一个带头双向循环链表 因需要实现一个节点类&#xff0c;其中包含哨兵位&#xff08;用来标识位置&#xff09;&#xff0c;节点信息&#xff08;val数据&#xff0c;prev后指针&#xff0c;next后指针&#xff09; template<class T> struct …

ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射

DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…

【学习自用】配置文件中的配置项

server.port服务器端口&#xff0c;常被用于指定应用程序运行时所监听的端口号spring.datasource.url用于配置数据源的数据库连接URLspring.datasource.username用于指定连接数据库的用户名spring.datasource.password用于配置数据源时设置数据库连接密码的属性mybatis.mapper-…

使用protobuf编译提示无法打开包括文件: ‘absl/log/absl_log.h’: No such file or directory

问题原因 Protobuf 依赖 Abseil&#xff1a; Protobuf 3.20 版本开始依赖 Abseil&#xff0c;但你的系统未正确安装或配置 Abseil。 头文件路径未包含&#xff1a; 编译器找不到 absl/log/absl_log.h&#xff0c;可能是因为 Abseil 未正确安装或未在项目中设置包含路径。 …

Spring AI Alibaba 文档检索使用

一、文档检索 (Document Retriever)简介 1、核心概念 文档检索&#xff08;DocumentRetriever&#xff09;是一种信息检索技术&#xff0c;旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。 DocumentRetriever通…

前端面试核心知识点整理:从 JavaScript 到 Vue 全解析

一、JavaScript 异步编程核心:Promise 与 async/await 1. Promise 深度解析 定义:Promise 是处理异步操作的对象,代表一个异步操作的最终状态(成功 / 失败)。三种状态: pending(进行中):初始状态,异步操作未完成。fulfilled(已成功):异步操作成功,调用 resolve …

音视频(四)android编译

前言 前面已经讲了在windows上应用了&#xff0c;这章主要讲述android上编译 1&#xff1a;环境 git 如果失败 直接跑到相应网站 手动下载 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 为什么用这个&#xff0…

【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

下面是一份详细的说明文档&#xff0c;介绍该脚本的功能、用法及各部分的含义&#xff0c;供您参考和使用&#xff1a; Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供创建、删除、导出 kubeconfig、加…

【计算机行业发展与重塑】

计算机行业正经历前所未有的变革&#xff0c;AI技术的爆发式发展与产业升级的深度融合&#xff0c;正在重塑行业格局与就业市场。以下从行业趋势、AI的核心价值、就业需求三个维度展开分析。 一、行业趋势&#xff1a;AI驱动下的多极增长 AI成为核心引擎 生成式AI的突破&#…

(高频SQL50题)1667. 修复表中的名字

问题 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是该表的主键(具有唯一值的列)。 该表包含用户的 ID 和名字…

基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献

Title 题目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的医学影像关联分析&#xff1a;利用潜在空间几何混杂因素校正法 01 文献速递介绍 人工智能&#xff08;AI&#xff09;已成为各个领域的…

开源免费虚拟化软件PVE功能介绍

Proxmox VE&#xff08;PVE&#xff09;提供了一个基于 Web UI&#xff08;管理界面&#xff09;的虚拟化管理平台&#xff0c;用户可以通过浏览器管理 虚拟机&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存储、网络、备份、用户权限等。 一、PVE Web 界面…

新球体育比分状态监控

文章目录 目标分析监控逻辑代码目标分析 网页监控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 监控逻辑 比分等数据主要是依赖JS加载得到,通过ajax后端进行渲染 代码 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函数详解 - 从入门到精通】

lodash的omit函数详解 - 从入门到精通 小白视角&#xff1a;什么是omit&#xff1f; omit在英文中意为"忽略"或"省略"。在编程中&#xff0c;它就是从一个对象中删除不需要的属性&#xff0c;返回一个新对象。 // 原始对象 const person {name: "…

软考笔记9——数据库技术基础

第九章节——数据库技术基础 数据库技术基础 第九章节——数据库技术基础一、基本概念1. 数据库与数据库系统2. 数据库的三级模式2.1 内模式2.2 概念模式2.3 外模式2.4 数据库的两级映射2.5 数据库设计的基本步骤 二、数据模型1. 基本概念2. E-R模型2.1 实体2.2 联系2.3 属性 3…

Django分页教程及示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 完整代码示例:结论Django的分页模块允许你将大量数据分割成更小的块(页面)。这对于以可管理的方式显示项目列表,如博客文章或产品…