java进阶-jvm精讲及实战

深入了解jvm及实战

  • 1.引言
  • 2.jvm概念理解
    • 1.1什么是jvm
    • 1.2 jvm功能
    • 1.3 jvm规范及主流版本
    • 1.4 jre jdk jvm的区别和联系
    • 1.5 jvm组成
  • 2.jvm-字节码文件class
    • 2.1 java和class无关性
    • 2.2 字节码应用场景
    • 2.4 字节码文件打开方式
    • 2.3 字节码文件组成
      • 2.3.1 一般信息
      • 2.3.2 常量池
      • 2.3.3 方法
      • 2.3.4 字段
      • 2.3.5 属性
      • 2.3.6 接口
  • 3.类生命周期
  • 4.类加载
  • 5.JVM运行时数据区
  • 6.本地方法接口
  • 7.执行引擎
  • JVM实战业务场景
    • 内存优化
    • GC优化
    • 性能优化

1.引言

jvm是深入了解java底层逻辑的必备知识储备,在中大型开发团队里,中高级工程师必须要了解和掌握,也是中高级工程师面试必考题,在实战中用于程序性能调优,内存泄露分析等

2.jvm概念理解

1.1什么是jvm

Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,它是Java 最具吸引力的特性之一。

Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库。

在这里插入图片描述

1.2 jvm功能

  • 解释和运行

对文件字节码里的指令,解释成机器语言,让计算机执行

  • 2.内存管理

自动为对象、方法分配内存
自动的垃圾回收机制,回收不在使用的对象

  • 3.即时编译

jvm为取得跨平台的效果,在程序每次运行时,必须把编译文件class翻译成机器指令,称之为实时翻译,而c/c++等语言是在编译
就就转化成机器指令,这个使java的自己执行效率天生不如c/c++等语言.
java采用了即使编译的技术方案,对热点代码进行优化,提升执行效率。
即时编译
(英语:just-in-time compilation,缩写为JIT;又译及时编译、实时编译),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法涉及在程序执行过程中(在运行期)而不是在执行之前进行编译。

热点代码
如果java发现一段代码反复出现,就会判断为热点代码,jvm会把这段代码编译成机器指令保存在内存里,下次操作时会直接调用内存里的代码,而不需要再转化成机器代码再执行,从而提高了执行效率

1.3 jvm规范及主流版本

  • JVM虚拟机规范由oracle制定,主要包含了java虚拟机再涉及和实现时需要准寻的规范,主要包含class字节码文件的定义、类和接口的加载和初始化、指令集等

  • 规范时对虚拟机设计的要求,而而不是对java设计的要求,也就是说虚拟机可以运行再其他语言比比如Groovy,Scala生成的class字节码文件之上

参考网址
https://docs.oracle.com/javase/specs/index.html

主流jvm版本
在这里插入图片描述

jvm版本发展历程
在这里插入图片描述

jvm有很多版本,我们一般使用HotSpot版本
在这里插入图片描述

1.4 jre jdk jvm的区别和联系

三者的大致结构是这样的,简单来说就是JDK包含JRE,JRE又包含JVM的关系。如下图所示:
在这里插入图片描述

  • JDK
    JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java开发工具(javac/java/jdb等)和Java基础的类库(即Java API 包)。

  • JRE
    JRE:Java Runtime Environment,是java运行时的环境,包含了java虚拟机,java基础类库,是使用java语言编写的程序运行所需要的软件环境。
    JRE:Java runtime environment 是运行基于Java语言编写的程序所不可缺少的运行环境,用于解释执行Java的字节码文件。

通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户

在这里插入图片描述
上图是Java中JRE的安装目录,里面有两个文件夹bin和lib。你可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和 lib和起来就称为JRE;

  • JVM
    JVM:Java Virtual Machine 是Java的虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。
    所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。

1.5 jvm组成

jvm由以下四部分组成:
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)

在这里插入图片描述

组成说明

1.程序在执行之前先要把 java 代码转换成字节码(class 文件)
2.jvm 首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 jvm 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine) 将字节码翻译成底层系统指令再交由CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口(NativeInterface) 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。
而我们通常所说的 JVM 组成指的是 运行时数据区(Runtime Data Area) ,因为通常需要程序员调试分析的区域就是“运行时数据区”,或者更具体的来说就是“运行时数据区”里面的 Heap(堆)模块

jvm整体框架

在这里插入图片描述

2.jvm-字节码文件class

jvm管理的是编译好的class字节码文件,我们先从字节码文件class了解开始

2.1 java和class无关性

我们通过javac把java文件编译成class文件,但class字节文件不一定全部来自java,java虚拟机jvm还能运用其他语言编程成class的字节文件。
Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode,Class文件语法)是构成平台无关性的基石,也是实现语言无关性的基石。
在这里插入图片描述

2.2 字节码应用场景

1.能回答如下算法问题:如

(1)int i=0;i=i++; i的值是多少
(2)int i=1; i +i +=++i +4.4+i; i的值为多少
(3)反射的原理和如何实现的?

2.解决版本冲突问题:
在这里插入图片描述
如上诉异常该如何解决

3.明明系统升级了,为什么bug还存在呢?(系统升级问题)

要解答如上问题,需要掌握相关的字节码文件知识。

2.4 字节码文件打开方式

字节码文件是编译好的二进制文件,用普通记事本打开的是乱码,无法阅读,需要借助专业的工具来
1.使用notepad++编辑器打开–点击插件–HEX-Editor(没有该插件的自行下载)–view in HEX,即可以16进制形式查看Clsaa文件。
当然也可以直接使用HEX-Editor软件打开:hex-editor。
打开如下所示
在这里插入图片描述

2.字节码分析插件
直接查看代码,不好做直观分析,我们一般采用jclasslib分析工具,提供单独安装版本和idea插件
我们可以使用idea插件,再插件库里查询并安装

在这里插入图片描述
安装好后,我们选中编译好的class文件,在idea窗口view->show Bytecode With Jclasslib
在这里插入图片描述
打开界面如下:
在这里插入图片描述

2.3 字节码文件组成

字节码文件由以下五部分组成
在这里插入图片描述
这里比较重要的分析数据:一般信息、常量池、方法 3部分

2.3.1 一般信息

在这里插入图片描述

包含:魔数、字节码文件对应的java版本号、访问表示标识(public final)父类和接口

(1)组成部分:魔术-magic

魔术在 Jclasslib分析面板看不到,我们用notepad++打开文件
在这里插入图片描述
二进制文件并不是通过后缀名如.jpg,.avi,.class来确定文件类型,因为文件后缀名可以任意修改的,一般采用开头的自己字节来表示文件类型,执行二进制文件的软件检查头几个字节是否是规定的常量,如果不是,则会报错。

常见二进制文件字节
在这里插入图片描述
可以看出,class字节文件的头4个字节数是cafebabe,我们打开所有class文件的开头的二进制代码都是这个。
这就是魔术-megic的作用。

尝试:
把.png文件后缀改成.avi,用视频浏播放器播放,看是否会提示出错。

(2)版本号

注意:当前流行是用maven来编译,这里编译是配置在maven里的编译版本,而不是idea里面的版本,那个是运行版本。

maven在setting.xml文件里面的编译配置

<profiles><!--<profile><id>jdk18</id><activation><jdk>1.8</jdk><activeByDefault>true</activeByDefault></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile>--><profile>   <id>jdk17</id><activation>   <activeByDefault>true</activeByDefault><jdk>17</jdk>   </activation><properties>   <maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><maven.compiler.compilerVersion>17</maven.compiler.compilerVersion><encoding>UTF-8</encoding></properties>   </profile>

在这里插入图片描述
版本号表示编程class使用的jdk版本,这里有个算法: 显示的版本号-44=jdk的版本号
这里52-44=18,对应的版本号就是1.8。(jdk1.2==46,后面每增加一个小版本,版本号就+1)
如果编译的版本和运行的版本不一致,尤其是高版本编译,低版本的运行环境,就会报错

我们在实际开发中,有两种常见场景:

1.我们开发时用的是高版本jdk,但服务器上用的是低版本,则会报错
2.我们引用第三方中间件jar编译的是高版本,但我们开发环境用的是低版本,也会报错:
例如以下:
在这里插入图片描述
查看jar包里的RandomStringUtils.class文件,其版本号为52,即编译版本是1.8,但我们开发环境是jdk1.6(对应50),运行程序时就会报上面错误。

解决方案:
1.升级运行环境的jre版本号,如上升级成1.8
2.第三方降低版本号,降级为1.6
一般选中第二种方案,因为第一种方案需要整体升级,有些不可控风险

3.常量计数池

编译后的常量池里的常量个数,注意不是类里面的常量个数
在这里插入图片描述

4.本类索引、父类索引

描述类索引对应的常量

5 访问标志

就是对应的类的修饰符,如示例是public

5.接口计数

此类实现了的接口数
在这里插入图片描述

6.字段计数

字节码对应类的字段数
在这里插入图片描述

7.方法计数

字节码对应类的方法数,注意:每个编译好后的类
在这里插入图片描述
注意如果没有默认构造函数,都要自动创建一个无参的构造函数

在这里插入图片描述

8.属性计数

这里属性不是类的字段,而是编译码文件里类的信息,如果有内部类等,则计数会加1

2.3.2 常量池

常量池保存了字符串常量、类或者接口名、字段名等数据,主要在字节码指令中使用

2.3.3 方法

2.3.4 字段

2.3.5 属性

2.3.6 接口

3.类生命周期

4.类加载

5.JVM运行时数据区

6.本地方法接口

7.执行引擎

JVM实战业务场景

内存优化

GC优化

性能优化

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

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

相关文章

Flutter底部导航栏插件persistent_bottom_nav_bar的使用

flutter 框架中的 persistent_bottom_nav_bar 插件可以让我们快速实现页面底部导航栏&#xff08;也就是 bottomNavigationBar &#xff09;的布局且能拥有多样的切换效果&#xff08;包括但不限于&#xff1a;动画切换效果、中间凸起按钮效果等&#xff09; 插件网址&#xf…

【MySQL·8.0·源码】subquery 子查询处理分析(一)

引言 在 SQL 中&#xff0c;子查询属于 Nested Query 的一种形式&#xff0c;根据 Kim 的分类[1]&#xff0c;Nested Query 即嵌套查询是一种 SQL-like 形式的查询语句嵌套在另一 SQL 中&#xff0c;SQL-like 的嵌套子句可以出现在 SELECT、FROM 和 WHERE 子句的任意位置。 在…

GBASE南大通用分享如何更新row类型表达式

从 SPL 例程内&#xff0c;您可使用 ROW 变量来更新 row 类型表达式。下图展示当员工的基本薪 酬按某一百分比增长时&#xff0c;用于更新 emp_info 表的 SPL 过程 emp_raise。 用于更新 emp_info 表的 SPL 过程。 SELECT 语句将来自 emp_info 表的 salary 列的行选择到 ROW …

Java项目:125SpringBoot教室预约管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 教室预约管理系统使用SpringBootMybatis进行开发&#xff0c;系统整体分为前台和后台&#xff0c;后台主要对教室&#xff0c;用户等信息进行管理&#xf…

SpringBoot+MyBatis使用pagehelper分页插件及其注意事项(含解决分页不生效问题)

1 前言 近期在做项目的时候&#xff0c;遇到了一个问题&#xff1a;在使用MyBatis的分页插件&#xff08;pagehelper&#xff09;时&#xff0c;发现其分页不生效&#xff0c;找了许多方法才得以解决&#xff0c;故写下这篇文章记录一下&#xff0c;帮助跟我遇到同样问题的同学…

无人机航迹规划(六):七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

阿赵UE学习笔记——解决UE资源不能正常显示缩略图的问题

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   这里分享一个虚幻引擎使用小技巧。在使用虚幻引擎的过程中&#xff0c;经常会遇到有些资源在重新打开项目的时候&#xff0c;会看不到缩略图&#xff0c;而是显示默认资源的图标&#xff1a; 这个时候&#xff0c;第一种…

java web mvc-06-play framework intro

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

每日一题——LeetCode1331.数组序号转换

方法一 排序哈希Map 首先用一个数组保存排序完的原数组&#xff0c;然后用一个哈希表保存各元素的序号&#xff0c;最后将原属组的元素替换为序号后返回。 var arrayRankTransform function(arr) {let set new Set(arr)let sortArrArray.from(set).sort((a,b)>a-b)let ma…

对Vue有状态组件和无状态组件的理解及使用场景

目录 一、Vue框架 二、Vue的有状态组件 三、Vue的无状态组件 四、有状态组件和无状态组件的区别 一、Vue框架 Vue是一款流行的JavaScript框架&#xff0c;用于构建用户界面。它被设计为易学易用的&#xff0c;同时也具备强大的功能和灵活性。 Vue具有以下特点&#xff1a…

【AI视野·今日NLP 自然语言处理论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 11 Jan 2024 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Leveraging Print Debugging to Improve Code Generation in Large Language Models Authors Xueyu Hu, Kun K…

03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

Linux中Iptables使用

概念&#xff1a;网络中的防火墙&#xff0c;是一种将内部网络和外部网络分开的方法&#xff0c;是一种隔离技术 作用&#xff1a; 防火墙在内网与外网通信时进行访问控制&#xff0c;依据所设置的规则对数据包作出判断&#xff0c;最大限度地阻止网络中的黑客破坏企业网络&…

MYSQL数据库基本操作-DQL-基本查询

一.概念 数据库管理系统一个重要功能就是数据查询。数据查询不应是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。 MySQL提供了功能强大&#xff0c;灵活的语句来实现这些操作。 MySQL数据库使用select语句来查询数据…

【学术论文写作】 鲁棒性实验写作的行文逻辑

文章目录 一、声明二、行文思路三、示例范文一范文二 一、声明 自己总结的&#xff0c;有问题望指正&#xff01; 二、行文思路 为什么要做鲁棒性测试怎么做实验结论对结果的解释 三、示例 PPT 范文一 2022, TIM, “A Robust and Reliable Point Cloud Recognition Netw…

GPT-5不叫GPT-5?下一代模型会有哪些新功能?

OpenAI首席执行官奥特曼在上周三达沃斯论坛接受媒体采访时表示&#xff0c;他现在的首要任务就是推出下一代大模型&#xff0c;这款模型不一定会命名GPT-5。虽然GPT-5的商标早已经注册。 如果GPT-4目前解决了人类任务的10%&#xff0c;GPT-5应该是15%或者20%。 OpenAI从去年开…

【JavaEE进阶】 MyBatis使用XML实现增删改查

文章目录 &#x1f38d;前言&#x1f340;配置连接字符串和MyBatis&#x1f343;写持久层代码&#x1f6a9;添加mapper接⼝&#x1f6a9;添加UserInfoXMLMapper.xml&#x1f6a9;单元测试 &#x1f334;增(Insert&#xff09;&#x1f6a9;返回⾃增id &#x1f38b;删(Delete)&…

【Vue3】组件通信

Vue3组件通信和Vue2的区别&#xff1a; 移出事件总线&#xff0c;使用mitt代替。vuex换成了pinia。把.sync优化到了v-model里面了。把$listeners所有的东西&#xff0c;合并到$attrs中了。$children被砍掉了。 1. props 若 父传子&#xff1a;属性值是非函数。若 子传父&…

泡泡玛特旗下IP亮相2024米兰时装周 LABUBU等化身时尚观察员​

2024年1月14日&#xff0c;在意大利米兰时装周上&#xff0c;泡泡玛特旗下IP THE MONSTERS成员LABUBU、ZIMOMO惊艳亮相PRONOUNCE珀琅汐2024秋冬大秀现场&#xff0c;作为时尚观察员的LABUBU和ZIMOMO以其独特的潮玩形象打动了顶级时尚圈。 据了解&#xff0c;泡泡玛特和PRONOUNC…

Qt简介及安装

“这不属于我&#xff0c;因为沉默背后也有冲动” 在互联网当中&#xff0c;最关注的几个比较核心的岗位&#xff1a; &#x1f6f6; 后端开发 &#x1f6f6; 前端开发 &#x1f6f6; 算法工程师 &#x1f6f6; 游戏开发 像后端开发中有认识…