jvm 篇

字节码的作用

  1. 跨平台性‌:字节码是Java实现跨平台特性的关键。Java源代码编译成字节码后,可以在任何安装了Java虚拟机(JVM)的设备上运行,这使得Java应用程序能够在不同的操作系统和硬件平台上运行而无需重新编译。
  2. 高效执行‌:字节码是一种中间码,它在源代码和机器码之间提供了一个抽象层。这种设计使得Java程序能够在运行时由JVM解释执行,或者通过即时编译器(JIT)动态转换为本地机器码,从而提高执行效率。
  3. 安全和稳定性‌:字节码的执行由JVM管理,这有助于防止恶意代码直接访问硬件资源,从而提高程序的安全性。此外,JVM的内存管理机制也有助于提高程序的稳定性,减少内存泄漏和崩溃的风险。
  4. 调试和优化‌:字节码的可读性和可分析性使得调试和优化变得更加容易。开发者可以使用专门的工具查看和分析字节码,从而更好地理解程序的执行流程,并进行相应的优化。
  5. 版本控制和兼容性‌:字节码文件包含版本信息,JVM可以根据这些信息判断代码是否兼容当前环境,从而进行适当的处理。这有助于管理不同版本的Java应用程序,确保它们在各自的环境中正常运行。

兼容多种语言

jvm的基本结构‌‌

‌1.类加载器(ClassLoader)‌:加载class文件到内存中进行使用。

2‌.运行时数据区(Runtime Data Area)‌:这是JVM在运行Java程序期间管理的内存区域,包括方法区(Metaspace)、Java堆(Heap)、虚拟机栈(Stack)程序计数器本地方法栈等部分。这些区域负责不同的职能,有各自的生命周期‌。

  1. 方法区‌:存储已被加载的类信息、常量、静态变量等。在JDK 1.8及以后版本中,方法区被实现为Metaspace。
  2. ‌Java堆‌:这是JVM中最大的内存区域,用于存储对象实例。堆空间是所有线程共享的,并且是垃圾收集的主要区域。
  3. ‌虚拟机栈‌:每个线程在执行方法时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接等信息。
  4. ‌程序计数器‌:记录当前线程执行的字节码指令地址。
  5. ‌本地方法栈‌:用于支持JVM调用本地方法(如C/C++代码)。

3‌.执行引擎(Execution Engine)‌:将字节码翻译成底层系统指令并执行,处理程序中的各种运算操作‌。

‌4.本地库接口(Native Interface)‌:用于支持JVM调用操作系统级别的本地库或其它语言的代码‌。

类加载器将class文件加载到内存中,字节码的指令存放在方法区由执行引擎中的解释器来执行把字节码指令翻译成机器指令,热点字节码指令可以缓存起来这样就不用每次都去使用解释器去翻译JIT编译器就是用来完成这个事情的,他只会去处理热点的字节码指令

垃圾回收‌:虽然垃圾回收器不属于执行引擎,但它与执行引擎紧密相关,共同管理内存,自动回收不再使用的对象,防止内存泄漏‌

双亲委派

首先我来说一下类加载的一个机制,就是我们自己写的java文件,到最终运行它必须要经过编译和类加载这两个阶段,而编译的过程就是.java文件编译成.class文件,而类的加载过程就是把.class文件加载到jvm内存中,装载完成以后会得到一个class对象,就可以使用new关键字来实例化这个对象,而类的加载过程需要涉及到类加载器,jvm在运行的时候会产生三个类加载器,这三个类加载器组成了一个层级关系,每一个类加载器分别去加载不同作用范围的jar包。

比如说Bootstrap Classloader 主要负责java核心类库的加载,也就是%{JDK_HOME}\lib下面的一个rt.jar和resources.jar等等

Extension Classloder主要负责%{JDK_HOME}\lib\ext目录下的一个jar包和class文件

Application Classloder主要负责当前应用里面ClassPath下面的所有jar包和类文件

除了系统自己提供的类加载器以外还可以通过classloder类来实现自定义加载器去满足一些特殊的需求。

双亲委派呢就是按照类加载器的层级关系逐层进行委派,比如说当我们先加载一个class文件的时候首先会去把这个class文件的查询和加载,委派给父加载器去执行,如果父加载器都无法加载,那么再尝试自己来加载这样一个class。

这样设计的好处我认为有两个:

第一个是安全性,因为这种层级关系实际上代表的是一种优先级,也就是所有的类加载优先要给到Bootstrap Classloder,那么对于核心类库中的一些类呢就没有办法被破坏。

第二个我认为这种层级关系的设计可以避免重复加载导致程序混乱的一些问题,因为如果父加载器已经加载过了那么子加载器就没有必要再去加载了

tomcat为什么要使用自定义类加载器

为了进行类的隔离,如果tomcat直接使用AppClassLoader类加载类,那就会出现如下情况:

  1. 应用A中有一个com.name.Hello.class
  2. 应用B中也有一个com.name.Hello.class
  3. 虽然都叫做Helo,但是具体的方法、属性可能不一样
  4. 如果App Class Loader先加载了应用A中的Hello.class
  5. 那么应用B中的Hello.class就不可能再被加载了,因为名字是一样
  6. 如果就需要针对应用A和应用B设置各自单独的类加载器,也就是WebappClassLoader
  7. 这样两个应用中的Hello.class都能被各自的类加载器所加载,不会冲突
  8. 这就是Tomcat为什么用自定义类加载器的核心原因,为了实现类加载的隔离
  9. JVM中判断一个类是不是已经被加载的逻辑是:类名+对应的类加载器实例

运行时数据区域由哪些部分组成,每个部分有哪些作用

局部变量表与操作数栈通常配合一起使用

运行时数据区的详细说明

运行时数据区是JVM内存管理的核心部分,主要包括以下几个子区域:

  • 方法区‌:存储类的元数据、常量池等信息。
  • ‌Java堆‌:存储所有对象实例,是垃圾收集的主要区域,分为新生代和老年代,新生代又分为Eden区和两个Survivor区。
  • ‌虚拟机栈‌:每个线程都有自己的栈,用于存储局部变量和方法调用的信息。
  • ‌本地方法栈‌:支持JVM调用本地方法(如C/C++代码)。
  • ‌程序计数器‌:记录当前线程执行的字节码指令地址。

方法区‌、‌Java堆多个线程共享的。

虚拟机栈、本地方法栈、程序计数器每个线程都有自己的一块区域,每个线程单独的。

程序计数器的作用

PC Register,程序计数寄存器,简称为程序计数器

  1. 是物理寄存器的抽象实现
  2. 用来记录待执行的下一条指令的地址
  3. 它是程序控制流的指示器,循环、异常处理、线程恢复等都依赖它来完成
  4. 解释器工作时就是通过它来获取下一条需要执行的字节码指令的
  5. 它是唯一一个在JVM规范中没有规定任何内存溢出情况的区域

虚拟机栈(Java栈、Java方法栈)

每个线程在创建时都会创建一个虚拟机栈,栈内会保存一个个的栈帧,每个栈帧对应一个方法。

  1. 虚拟机栈是线程私有的
  2. 一个方法开始执行栈帧入栈、方法执行完对应的栈帧就出栈,所以虚拟机栈不需要进行垃圾回收
  3. 虚拟机栈存在内存溢出、以及栈溢出
  4. 线程太多,就可能会出现内存溢出,线程创建时没有足够的内存去创建虚拟机栈了
  5. 方法调用层次太多,就可能会出现栈溢出
  6. 可以通过-Xss来设置虚拟机栈的大小。

栈帧

操作数据栈,也是栈帧中的一部分,操作数据栈是用来在执行字节码指令过程中用来进行计算的。

操作数栈

0:bipush:代码中给的值

2:istore_1:放入到局部变量表1里面

6:iload_1:从局部变量表中拿1这个位置的数据

操作数栈:执行字节码指令的时候帮助我们或者说是辅助我们去进行计算的一个东西

局部变量:表就是专门去记录我每个方法中的每个局部变量 ,在执行的过程中,这个变量所对应的值是什么,去进行一个实时的记录。

return执行完了,对应的栈帧也会消失掉

本地方法栈

本地方法,在Java中定义的方法,但由其他语言实现

虚拟机栈存的是Java方法调用过程的栈帧,本地方法栈存的是本地方法调用过程的栈帧。

也是线程私有的,也可能会出现内存溢出和栈溢出

堆以及堆中的各个区域的作用是什么?

堆是JVM中最重要的一块区域,JVM规范中规定所有的对象和数组都应该存放在堆中,在执行字节码指令时会把创建的对象存入堆中,对象对应的引用地址存入虚拟机栈中的栈帧中,不过当方法执行完之后,刚刚所创建的对象并不会立马被回收,而是要等JVM后台执行GC后,对象才会被回收

-Xms:ms(memory start),指定堆的初始化内存大小,等价于-XX:InitialHeapSize

-Xmx:mx(memory max),指定堆的最大内存大小,等价于-XX:MaxHeapSize

一般会把-Xms和-Xmx设置为一样,这样JVM就不需要在GC后去修改堆的内存大小了,提高了效率,默认情况下,初始化内存大小=物理内存大小/64,最大内存大小=物理内存大小/4

可以通过-XX:NewRatio参数来配置新生代和老年代的比例,默认为2,表示新生代占1,老年代占2,也就是新生代占堆区总大小的1/3

一般是不需要调整的,只有明确知道存活时间比较长的对象偏多,那么就需要调大NewRatio,从而调整老年代的占比。

Eden:伊甸园区,新对象都会先放到Eden区(除非对象的大小都超过了Eden区,那么就只能直接进老年代)S0、S1:Survivor0、Survivor1区,也可以叫做from区、to区,用来存放MinorGC(YGC)后存在的对象

默认情况下(Eden区:S0区:S1区)的比例关系为(8:1:1),也就是Eden区占新生代大小的8/10可以通过-XX:SurvivorRatio来调整

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

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

相关文章

【Springboot】Springboot 自定义线程池的参数配置最优是多少

博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【2】Cisco SD-WAN 组件介绍

1. 概述 Cisco SD-WAN 是一套基于软件定义的广域网(SD-WAN)解决方案,能够提供安全、可扩展且高效的网络连接。它通过集中的控制和智能路径选择,实现跨多个站点的可靠性、可见性和优化。 在 Cisco SD-WAN 体系架构中,主要由四个核心组件构成: vManage(管理平面) vSmart…

测试中的第一性原理:回归本质的质量思维革命

在软件工程领域,测试活动常被惯性思维和经验主义所主导——测试用例库无限膨胀、自动化脚本维护成本居高不下、测试策略与业务目标渐行渐远。要突破这种困境,第一性原理(First Principles Thinking)提供了独特的解题视角&#xff…

《chatwise:DeepSeek的界面部署》

ChatWise:DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现,再到测试与优化,全面阐述了整个部署过程中的关键步骤和解决方案。通过本文,读者可以深入了解DeepSee…

机器学习在癌症分子亚型分类中的应用

学习笔记:机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题:Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊:Cancer Cell发表时间:20…

什么是AIOps?

AIOps(人工智能运维,Artificial Intelligence for IT Operations)是通过使用人工智能(AI)技术来增强 IT 运维(IT Operations)的智能化、自动化和效率的概念。它结合了机器学习、数据分析、自动化…

使用deepseek快速创作ppt

目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型,其推理能力炸裂,但是DeepSeek官方没有提供生成PPT功能,如果让DeepSeek做PPT呢? 有个途径:在DeepSeek让其深度思考做出PPT脚本&#xf…

DeepSeek 引领的 AI 范式转变与存储架构的演进

近一段时间,生成式 AI 技术经历了飞速的进步,尤其是在强推理模型(Reasoning-LLM)的推动下,AI 从大模型训练到推理应用的范式发生了剧变。以 DeepSeek 等前沿 AI 模型为例,如今的 AI 技术发展已不局限于依赖…

vscode 设置在编辑器的标签页超出可视范围时自动换行(workbench.editor.wrapTabs)

“workbench.editor.wrapTabs”: true 是 VS Code(Visual Studio Code) 的一个设置项,它的作用是 在编辑器的标签页超出可视范围时自动换行,而不是显示滚动条。 需要修改settings.json 参考:settings.json 默认值&a…

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行(下载) 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…

前端组件标准化专家Prompt指令的最佳实践

前端组件标准化专家Prompt 提示词可作为项目自定义提示词使用,本次提示词偏向前端开发的使用,如有需要可适当修改关键词和示例 推荐使用 Cursor 中作为自定义指令使用Cline 插件中作为自定义指令使用在力所能及的范围内使用最好的模型,可以…

介绍10个比较优秀好用的Qt相关的开源库

记录下比较好用的一些开源库 1. Qt中的日志库“log4qt” log4qt 是一个基于 Apache Log4j 设计理念的 Qt 日志记录库,它为 Qt 应用程序提供了强大而灵活的日志记录功能。Log4j 是 Java 领域广泛使用的日志框架,log4qt 借鉴了其优秀的设计思想&#xff…

如何打造一个更友好的网站结构?

在SEO优化中,网站的结构往往被忽略,但它其实是决定谷歌爬虫抓取效率的关键因素之一。一个清晰、逻辑合理的网站结构,不仅能让用户更方便地找到他们需要的信息,还能提升搜索引擎的抓取效率 理想的网站结构应该像一棵树,…

态、势、感、知中的信息

“态、势中的信息”与“感、知中的信息”分别对应客观系统状态与主观认知过程的信息类型,其差异体现在信息的来源、性质、处理方式及作用目标上。以下通过对比框架和具体案例解析两者的区别: 态势中的信息中的态信息指系统在某一时刻的客观存在状态&…

文本生图的提示词prompt和参数如何设置(基于Animagine XL V3.1)

昨天搞了半天 Animagine XL V3.1,发现市面上很多教程只是授之以鱼,并没有授之以渔的。也是,拿来赚钱不好吗,闲鱼上部署一个 Deepseek 都能要两百块。这里我还是想写篇文章介绍一下,虽不全面,但是尽量告诉你…

基于docker搭建Kafka集群,使用内部自带的Zookeeper方式搭建

前提条件 按照【kafka3.8.0升级文档成功搭建kafka服务】 环境:192.168.2.91 192.168.2.93 并以192.168.2.91环境kafka自带的zookeeper作为协调器。 使用基于KRaft方式进行kafka集群搭建教程 搭建kafka-ui可视化工具 1、创建kafka集群节点192.168.2.91 &#xff…

GitPuk快速安装配置教程(入门级)

GitPuk是一款国产开源免费的代码管理工具,工具简洁易用,开源免费,本文将讲解如何快速安装和配置GitPuk,以快速入门上手。 1、安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Linux安装 以下以Centos7安装…

奖励模型中的尺度扩展定律和奖励劫持

奖励模型中的尺度扩展定律和奖励劫持 FesianXu 20250131 at Wechat Search Team 前言 最近在考古一些LLM的经典老论文,其中有一篇是OpenAI于ICML 2023年发表的文章,讨论了在奖励模型(Reward Model)中的尺度扩展规律(S…

ASP.NET Core中Filter与Middleware的区别

中间件是ASP.NET Core这个基础提供的功能,而Filter是ASP.NET Core MVC中提供的功能。ASP.NET Core MVC是由MVC中间件提供的框架,而Filter属于MVC中间件提供的功能。 区别 中间件可以处理所有的请求,而Filter只能处理对控制器的请求&#x…

力扣240 搜索二维矩阵 ll

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,…