【Java】JVM字节码分析

news/2025/3/17 4:22:26/文章来源:https://www.cnblogs.com/changwan/p/18233599

一、功能

1、工作原理

whiteboard_exported_image (1).png

2、解释和运行

jvm本质上是运行在计算机上的程序,负责运行java字节码文件

对字节码文件中的指令,实时的解释成机器码,供计算机执行

3、内存管理

自动为对象、方法等分配内存

自动垃圾回收机制,回收不再使用的对象

4、 即时编译

在java中每次执行都需要实时解释字节码文件成机器码,导致效率较低、速度变慢。这么做的原因是因为需要跨平台,不同操作系统的java虚拟机不同,解释编译的也不一样,不同的虚拟机会转成当前操作系统的字节码。

即时编译就是为了解决这个性能问题。JVM会识别热点代码(短时间多次调用), 会主动优化并且解释成机器码 ,将这个机器码保存在内存中。下次如果调用这段热点代码会直接从内存中取出调用。这样就省略了一次解释的步骤。这样在某些情况下性能就会提升很大

二、解释字节码

使用工具jclasslib工具查看class字节码

class字节文件的头文件的前四个字节是检验文件类型用的,class字节文件的头文件为CAFEBABE

1、分析class文件

public class HelloWorld {public static void main(String[] args) {int i = 0 ;int j = i+1;System.out.println(j);}
}

对应的.class字节文件为

 0 iconst_0    #将常量0放入操作数栈中1 istore_1    #将操作数栈顶的数值存储到局部变量表1的位置2 iload_1     #将局部变量表1中的数复制到栈上3 iconst_1    #将常量1放入操作数栈中栈中4 iadd        #将栈中最上面两个值进行相加,存储到栈顶5 istore_2    #从栈中取出操作数放入局部变量表中2号位置
13 return      #方法结束

whiteboard_exported_image.png

2、分析i++

public class HelloWorld {public static void main(String[] args) {int i = 0 ;i = i++; System.out.println(i);}
}
 0 iconst_0       #将常量0放入操作数栈1 istore_1       #将栈顶元素取出存储到局部变量表1的位置2 iload_1        #将局部变量表1位置的操作数复制到操作栈3 iinc 1 by 1    #将布局变量表1的位置的值加16 istore_1       #将栈顶元素取出存储到局部变量表1的位置
10 iload_1        #将布局变量表1位置的操作数复制到操作数栈
14 return

结果输出为0

3、分析++i

public class HelloWorld {public static void main(String[] args) {int i = 0 ;i = ++i; System.out.println(i);}
}
 0 iconst_0       #将常量0放入操作数栈1 istore_1       #将栈顶元素取出存储到局部变量表1的位置2 iinc 1 by 1    #将布局变量表1的位置的值加15 iload_1        #将布局变量表1位置的操作数复制到操作数栈6 istore_1       #将栈顶元素取出存储到局部变量表1的位置
10 iload_1        #将布局变量表1位置的操作数复制到操作数栈
14 return

输出结果为1

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

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

相关文章

23柏鹭杯-misc

我记得比赛的时候,misc都是0解。 怎么不算另类的1血呢? help_me实在不会,arm看不了一点消失的钥匙 先看验证逻辑,能够看到generateZipPassword和decryptFlag这两个方法内容不见了通过在apk中寻找半年,找到一个时间不对的classes3.dex,查看hex发现是gz压缩导出解压一下,拿…

云原生时代:从 Jenkins 到 Argo Workflows,构建高效 CI Pipeline

ACK One Serverless Argo 工作流作为全托管的 Argo 工作流服务,可以帮助您实现更大规模、具有更快的运行速度、及更低成本的 CI Pipeline,与 ACK One GitOps[8](Argo CD)、Argo Event 等事件驱动架构可以构建完整的自动化 CI/CD Pipeline。作者:蔡靖 Argo Workflows Argo …

智慧城市的规划与实施:科技引领城市运行效率新飞跃

随着信息技术的飞速发展,智慧城市的构想正逐步成为现实。作为地理信息与遥感领域的研究者,我深知在这一转型过程中,技术的创新与应用是提升城市运行效率的关键。本文旨在探讨如何利用地理信息系统(GIS)、遥感技术、大数据、物联网(IoT)等前沿科技,推动智慧城市的规划与…

WebLogic启动报Could not get the server file lock

报错信息如下:解决: 方法一: 引用:https://blog.51cto.com/hifon/2796939 方法二: 1. 出现问题可能是上次没有正确关闭Weblogic,可到如下目录,执行stopWebLogic.cmd(Windows),或stopWebLogic.sh(Linux) C:\Weblogic14.1.1.0\user_projects\domains\staubli\bin

(数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用

本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1 简介大家好我是费老师,就在几天前,经过六年多的持续开发迭代,著名的开源高性能分析型数据库DuckDB发布了其1.0.0正式版本。DuckDB具有极强的单机数据分析性能表现,功能丰富,…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

为了帮助用户更高效地使用 RocketMQ,阿里云消息队列 ApsaraMQ 提供了一套名为 RocketMQ Copilot 的辅助工具集。它将专家的实践经验产品化,使得即便是缺乏经验的用户也能迅速掌握 RocketMQ 客户端的正确用法,利用云消息队列 RocketMQ 版的可观测性工具进行监控、并高效地排查…

无缝融合:使用 Python 和 PyFFmpeg 合并视频的完整指南

前言 在当今数字化时代,视频内容无处不在。从社交媒体到在线教育,视频已经成为我们生活中不可或缺的一部分。但是,有时候我们可能需要将多个视频片段合并成一个,创造出更丰富、更有吸引力的内容。而今天,我们将向您展示如何使用 Python 和 PyFFmpeg 工具实现这一目标。 准…

音频剪裁大师:使用 Python 和 ffmpeg 分割音频的完整指南

前言 在音频处理中,有时候我们需要对音频文件进行分割,提取其中的部分内容以满足特定需求。而 Python 提供了许多强大的工具和库来实现这一目标,其中 ffmpeg 是一个功能强大的工具,它不仅支持音频分割,还能进行音频转码、合并、提取等操作。本文将介绍如何使用 Python 和 …

正则 .*? 和 .* 的区别是什么

在正则表达式中,.* 和 .*? 的区别在于它们的贪婪程度: .* 是贪婪的,意味着它会尽可能多地匹配字符,直到没有更多字符可匹配。 .*? 是非贪婪的(或懒惰的),意味着它会尽可能少地匹配字符,一旦找到满足整体模式的最小匹配,就会停止。 举例说明: 对于字符串 123456 和模…

钉钉机器人远程重启系统服务

from flask import Flask, request import subprocessapp = Flask(__name__)@app.route(/send_message, methods=[GET]) def send_message():webhook_url = https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN    # YOUR_TOKEN是钉钉机器人的hookmessage = {&…

kalman fiter

卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。 组成以及步骤 1.预测状态方程 目的:由系统状态变量k-1时刻的最优值和系统输入计算出k时刻的…