网站策划制作公司 北京/关键词分析工具有哪些
一、为什么要学习 JVM ?
1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点;
2. 未来在⼯作场景中,也许你会遇到以下场景:
- 线上系统突然宕机,系统⽆法访问,甚⾄直接OOM
- 线上系统响应速度太慢,优化系统性能过程中发现 CPU占用过高,原因也许是因为 JVM GC 次数过于频繁;
- 新项⽬上线,需要设置 JVM 的各种参数;
二、JDK\JRE\JVM
- JDK:全称“Java Development Kit ” Java 开发⼯具包,提供 javac 编译器、 jconsole,jheap 等监控⼯具;
- JRE:全称“ Java Runtime Environment ” Java 运⾏环境,提供 Class Library 核心类库+JVM;
- JVM:全称“ Java Virtual Machine ” Java 虚拟机,⽤于运⾏ Java 应⽤程序;
三、Java程序执⾏过程
- 编译:通过 件。 javac 命令,调⽤ JDK 编译器,将
- 执⾏:通过 *.java 源⽂件编译成 *.class 字节码⽂ java 命令,调⽤ JVM 虚拟机,执⾏ *.class 字节码⽂件。
四、Java程序的跨平台
计算机平台是什么?
我们通常把 CPU 处理器与操作系统构成的系统架构,称为计算机平台。
现代的电⼦计算机是基于⼆进制设计实现,所以 CPU 仅能识别 0 与 1 这样的⼆进制信号。⽽ 计算机程序的本质就是 0 与 1 之间的不同组合产⽣的机器指令,交给 CPU 去执⾏。CPU为了能识 别执⾏机器指令,就需要不同 CPU 架构和指令集来⽀持。不同的⼚商,设计⽣产 的 CPU , CPU 架构和指令集也是不同的。
常⻅的指令集主要分为:精简指令集( RISC )和复杂指令集( CISC )。
- 复杂指令集( CISC ): X86 和 X64 两种 CPU 架构基于 CISC 复杂指令集,⽐如: Intel 、 AMD 等⼚商的 CPU 。
- 精简指令集( RISC ): ARM 架构的CPU基于 RISC 精简指令集,⽐如: Compaq 的 Alpha 、 HP 的 PA-RISC 、 IBM 的 Power PC 、 Apple 的 M1 。 在底层硬件及指令集之上,需要搭载不同的操作系统,⽤于⽀持不同的 CPU 指令集。
例如:早 期的 MacOS 操作系统只⽀持 Power 系列的 CPU 。最新的 MacOS 系统只能安装在 M1 芯⽚的 CPU 。
Java 是⼀种跨平台的编程语⾔,主要是为了让相同的 Java 应⽤程序代码,不⽤做任何修 改,可以在不同计算机系统平台上正常运⾏,兼容各种主流操作系统+ CPU 指令集。
跨平台的原因
实现跨平台的原因,主要有两个
- 不同的平台,相同的源代码,编译的字节码是相同的,所以字节码⽂件可以在不同平台“ 通⽤” ;
- 不同的平台,执⾏字节码时,都需要各⾃的 JVM 虚拟机版本,⽤于将字节码翻译成当前平台可 以执⾏的机器码指令;
五、静态编译器
通过 JDK 提供的静态编译器,将Java 源⽂件编译成字节码⽂件。
编译过程包括:
- 词法分析:通过空格分隔出源代码中的单词、操作符、控制符等信息,将其形成 流,传递给语法解析器。
- 语法分析:将 token 信息流按照 Java 语法规则,组装成⼀颗语法树
- 语义分析:对语法树进⾏关键字使⽤、类型匹配、作⽤域等语法检查。
- 字节码:当语义分析完成后,可以⽣成字节码
六、字节码
当1个 Java 源文件被编译后,就会按照 JVM 规范和字节码定义,产生 1个 class 字节
码文件,文件内容由 10 个固定部分组成。前 4 个字节非常特殊,红色框的 cafe babe 是詹姆斯定义的魔法数,它的作用是标志当前文件是一个字节码文件。当 JVM 在进行类加载的 Load 阶段时,如果没有识别到该标志,就说明文件不是字节码文件或已损坏,则无法进行加载。绿色框代表当前版本号,0x34 的十进制为 52 ,是JDK8 的内部版本号,代表这个字节码文件基于 JDK8 编译。
剩余部分中的每个字节均代表一个字节码指令,由于每个指令的长度按照 1 个字节存储,所以每个指令被称为字节码(Bytecode ),Java 所有的字节码指令有 200 多个。
由于纯数字的字节码指令阅读⽐较困难,所以 JVM 在字节码指令的基础上设计了⼀套操作码助 记符,使⽤特殊单词来代替对应的数字指令。
例如:
- 0x15 ILOAD :读取 int 类型的局部变量
- 0x36 ISTORE :保存int类型的局部变量
- 0x60 IADD :执⾏两个 int 类型的数值加法运算
- 0xbb NEW :创建对象
- 0xbc NEWARRAY :创建数组
- 0xac IRETURN :返回 int 类型结果
七、JVM执⾏⽅式
JVM执⾏⽅式
JVM 以解释+编译混合模式,执⾏字节码⽂件。
- JVM 的执⾏⽅式以解释执⾏为主。执⾏过程中, JVM 将每个字节码⽂件中的每个指令,通过 解释器转换成当前平台可以识别的机器码,然后交给CPU 执⾏。
- 为了提⾼执⾏效率, JVM 还会在运⾏期间, JVM 通过热点代码的统计分析,识别⾼频的⽅法 调⽤,循环体、公共模块等,当超过阈值时, JVM 会基于 JIT 即时编译器( me compiler )将热点代码转换成机器码,直接交给 just-in-ti CPU 执⾏,提⾼执⾏效率。
a. Client 模式下默认阈值是 1500 次, Server 模式下是 10000 次。
- ● JVM 解释器:程序执⾏的时候,解释器⾸先发挥作⽤,省去了编译器编译时间,加快程序的执 ⾏效率。
- ● JIT 编译器:在程序运⾏过程中,随着时间的推移, JIT 开始慢慢发挥了作⽤,把热点代码 编译成本地代码后,以后执⾏相同的代码,即可直接交给 CPU 执⾏,带来更⾼的执⾏效率。
机器在热机状态可以承受的负载要⼤于冷机状态(刚启动时 ),如果以热机状态时的流量进⾏切 换,可能使处于冷机状态的服务器因⽆法承载流量⽽假死。所以,在⽣产环境中发布应⽤,应该以分 批的⽅进⾏发布,根据机器数量划分成多个批次,每个批次的机器数⼤概占到整个集群的 15% 。
故障案例:某应⽤在线发布新版本,采⽤进⾏分批发布,发布总批数误填写成分为两批发布。如 果是热机状态,正常情况下,集群中的⼀半的机器可以勉强⽀撑负载流量,但由于刚启动的 JVM 均 是解释执⾏,还没有进⾏热点代码统计和JIT动态编译,导致机器启动之后,当前 1/2 发布成功的 服务器⻢上全部宕机。
八、类加载器
字节码必须通过类加载器,通过加载、验证、解析等校验步骤,将字节码⽂件中的类,加载⾄ JVM 的中运⾏时数据区,才可以执⾏字节码。
类加载器的加载过程
当一个类被使用的时候,才会加载到内存中,类加载的过程有:加载、验证、准备、解析、初始化。其中中间三步合并称为链接。
- - 加载:通过包名+类名,获取这个类,准备用流进行传输,将这个类加载到内存中,并创建一个class对象
- - 验证:验证class文件中的信息是否符合虚拟机规范,有没有安全隐患
- - 准备:负责为类的类变量(static修饰的变量)分配内存,并设置默认的初始化值
- - 解析:将类的二级制数据流中的符号引用替换为直接引用。(本类中如果用到了其他类,此时就需要找到对应的类)
- - 初始化:静态变量赋值以及初始化其他资源
九、垃圾收集器
JVM 在运⾏期间,通过 Garbage Collctor 垃圾收集器,定期对运⾏时数据区进⾏垃圾对 象的回收,从⽽实现了内存⾃动管理。
十、JVM组成结构
JVM 由类加载器、运⾏时数据区、 JVM 解释器、 JIT 即时编译器、垃圾回收器、本地⽅法库等部分组成。
由类加载器完成字节码⽂件的加载验证和解析,存储⾄运⾏时数据区,并由执⾏引擎中的解释 器,完成字节码到机器码的解释执⾏。同时进⾏热点代码的统计分析,调⽤ JIT 即时编译器将字节 码直接编译成机器码,提⾼执⾏效率。JVM运⾏期间的⽅法调、数据对象统⼀存放⾄运⾏时数据区。
相关文章:

JVM虚拟机的组成
一、为什么要学习 JVM ? 1. “ ⾯试造⽕箭,⼯作拧螺丝” , JVM 属于⾯试官特别喜欢提问的知识点; 2. 未来在⼯作场景中,也许你会遇到以下场景: 线上系统突然宕机,系统⽆法访问,甚⾄直…...

探索CSS clip-path: polygon():塑造元素的无限可能
在CSS的世界里,clip-path 属性赋予了开发者前所未有的能力,让他们能够以非传统的方式裁剪页面元素,创造出独特的视觉效果。其中,polygon() 函数尤其强大,它允许你使用多边形来定义裁剪区域的形状,从而实现各…...

【华为OD机试B卷】单词接龙(C++/Java/Python)
题目 题目描述 单词接龙的规则是: 可用于接龙的单词首字母必须要前一个单词的尾字母相同;当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。现给定一组全部由小写字母组成单词数组,并指定其中的一个…...

项目实训-vue(十七)
项目实训-vue(十七) 文章目录 项目实训-vue(十七)1.概述2.问诊类型3.问诊时间统计4.看诊时间统计 1.概述 本篇博客将记录我在数据统计页面中的工作。因为项目并未实际运行,因此我们拟定了一些数据,并构建了…...

Android10 SystemUI系列 需求定制(二)隐藏状态栏通知图标,锁屏通知,可定制包名,渠道等
一、前言 SystemUI 所包含的界面和模块比较多,这一节主要分享一下状态栏通知图标和通知栏的定制需求:隐藏状态栏通知图标,锁屏通知,可定制包名,渠道等 来熟悉一下Systemui。 二、准备工作 按照惯例先找到核心类。这里提前说一下,这个需求的修改方法更多,笔者这里也只…...

Linux:RAID磁盘阵列
目录 一、RAID(磁盘阵列) 1.1、概念 1.2、RAID 0(条带化存储) 1.3、RAID 1(镜像存储) 1.4、RAID 5 1.5、RAID 6 1.6、RAID 10 (先做镜像,再做条带) 二、创建RAID 2.1、建立RAID 0 …...

MongoDB和AI 赋能行业应用:零售
欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例,涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术(Gen AI),零售商可以创造…...

MQ~消息队列能力、AMQP协议、现有选择(Kafka、RabbitMQ、RocketMQ 、Pulsar)
消息队列 消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。 常⽤的消息队列主要这 五 种,分别…...

开源网安参与编制的《代码大模型安全风险防范能力要求及评估方法》正式发布
代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时,也带来了对安全风险防范能力的挑战。基于此,中国信通院依托中国人工智能产业发展联盟(AIIA),联合开源…...

【树状数组 队列】1505. 最多 K 次交换相邻数位后得到的最小整数
本文涉及知识点 树状数组 队列 LeetCode1505. 最多 K 次交换相邻数位后得到的最小整数 给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。 你可以交换这个整数相邻数位的数字 最多 k 次…...

【附精彩文章合辑】当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案
当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案。以下是一些示例: 一、明确需求与目标 例子1:在线购物平台 需求分析:平台需要支持用户注册、登录、浏览商品、下单购买、…...

Word中删除空白页
① 文字后面出现的空白页 把鼠标放在空白页的位置,按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧,直到出现一个空白的箭头,点击一下选中空白页,然后再Ctrl D,打开字体选项卡,在效果中…...

30.Netty进阶-黏包半包解决方案-短链接
客户端发送一次完整的消息,然后就把与服务端的链接断开。服务端读到的结果就是-1。 服务器就知道 从链接建立到断开,发送的数据是一条完整的数据。 客户端代码 package com.xkj.nian;import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.net…...

斜堆(数据结构篇)
数据结构之斜堆 斜堆 概念: 斜堆是左式堆的自调节形式,斜堆和左式堆间的关系类似于伸展树和AVL树间的关系斜堆是具有堆序性的二叉树,但是不存在对树的结构限制不同于左式堆,关于任意节点的零路径长的任何信息都不保留ÿ…...

河南大学24计算机考研数据,有三个学院招收计算机相关专业,都是考的408!
河南大学(Henan University),简称“河大”,是河南省人民政府与中华人民共和国教育部共建高校,国家“双一流”建设高校,入选国家“111计划”、中西部高校基础能力建设工程、卓越医生教育培养计划、卓越法律人…...

ubuntu离线安装docker导入镜像
docker安装包 准备工作 1.准备一个docker.service文件 内容如下: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target[Service] Typenoti…...

鸿蒙原生应用元服务开发-位置服务申请权限
申请位置权限开发指导 场景概述 应用在使用位置服务系统能力前,需要检查是否已经获取用户授权访问设备位置信息。如未获得授权,可以向用户申请需要的位置权限。 系统提供的定位权限有: ohos.permission.LOCATION:用于获取精准位置…...

基于SpringBoot的“智慧食堂”管理系统设计与实现
你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBootVue 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 用户管理界面 菜品…...

高效记录收支明细:揭秘如何通过曲线图精准分析每月开销
在理财的道路上,你是否曾感到迷茫和无力?每个月的开销如同流水般悄无声息地滑过指尖,但你却始终难以掌握自己的财务脉络。今天,我们为你揭秘一个全新的理财方法——通过曲线图精准分析每月开销,让你的财务生活焕发智慧…...

开发注意事项
开发注意事项 简介1. 查询条件照成的OOM问题原因注意事项 2. 因为事务导致数据查询不到问题原因注意事项 简介 这篇文章主要是想记录在开发过程中遇到的坑已经注意事项。 1. 查询条件照成的OOM 问题 SIT 环境内存突然暴增,直接打到100%,导致服务频繁…...

Vue79-路由组件独有的2个新的生命周期钩子
一、需求 news.vue路由组件被缓存了(因为想要保留里面的输入框的数据!),导致,路由页面切走,组件也不会被销毁,所以,beforeDestroy()函数就不会被执行,所以,定…...

Lua博客网站支持搜索、评论、登录注册
该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述:开源Lua网站开发服务(FastWeb)支持:注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示:...

BGP高级特性
BGP路由反射器 l 路由反射器的两种角色 RR(router reflector):路由反射器 client:RR客户端 l RR会将学习到的路由反射出去,从而使得IBGP路由在AS内传播时无需建立IBGP的全互联结构 l 将一台BGP路由器指定为RR的…...

鸿蒙开发:1.环境搭建和入门
环境搭建 安装HUAWEI DevEco Studio 简介 HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造, 为运行在HarmonyOS和OpenHarmony系统上的应用和服务提供一站式的开发平台。 特点 1.高效智能代码编辑:支持ArkTS、JS、C/C等语言的代码高亮、…...

python学习 - 设计模式 - 组合模式
组合模式 Composite , 将对象组组合成树形结构以表示’部分-整体’ 的层次结构.组合模式使得用户对单个对象的组合对象的使用具有一致性 #!/usr/bin/python # -*- coding:UTF-8 -*- # File : d1.py # Software: PyCharm""" 组合模式 Composite , 将对象组组…...

JavaScript倒序遍历数组:计算年度累积值
在 JavaScript 开发中,我们经常需要对数组中的数据进行特定顺序的处理。倒序 for 循环是一种常见的技术,它可以从数组的末尾开始向前遍历元素。这种技术特别适用于需要基于前一个元素的值来计算当前元素的场景。 示例场景:计算年度累积值 假…...

华为仓颉编程语言观感
这里写自定义目录标题 相似点(主要与Swift进行对比)不同点亮点 花了半天时间,对华为新出的仓颉编程语言做了简单的了解,整体观感如下: 仓颉语言看起来是一门大而全的语言,吸纳了现存的很多中编程语言的范式…...

Elasticsearch:倒数排序融合 - Reciprocal rank fusion - 8.14
警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。语法可能会在正式发布之前发生变化。Elastic 将努力修复任何问题,但技术预览中的功能不受官方正式发布功能的支持 SLA 约束。 倒数排序融合 (reciprocal rank fusion - RRF) 是一…...

Day13—大语言模型
定义 大语言模型(Large Language Models)是一种基于深度学习的自然语言处理(NLP)模型,用于处理和生成人类语言文本。 一、认识NLP 什么是NLP NLP(Natural Language Processing)࿰…...

php基础语法_面向对象
PHP php代码标记 多种标记来区分php脚本 ASP标记:<% php代码 %> 短标记: 脚本标记: 标准标记(常用): 简写风格: ASP风格:<% php代码 %> 注意:简写风格和ASP风格…...