Java虚拟机(JVM)之字节码文件

news2024/11/23 22:58:47

让我们先来简单了解一下JVM。

JVM功能:

  1、解释和运行:对字节码文件中的指令,实时的解释成机器码让计算机执行。

  2、内存管理:自动为对象、方法等分配内存;自动的垃圾回收机制,回收不再使用的对象。

  3、即时编译:对热点代码进行优化提升执行效率。

JVM组成:

  1、类加载器classLoader:加载class字节码文件中的内容到内存中。

  2、运行时数据区域(JVM管理的内存):负责管理JVM使用到的内存,比如创建对象和销毁对象。

  3、执行引擎(即时编译器,解释器,垃圾回收器等):将字节码文件中的指令解释成机器码,同时使用即时编译器优化性能。

  4、本地接口:调用本地已经编译好的方法,比如虚拟机中提供的c/c++的方法。

字节码文件,由5个部分组成:

  基础信息:魔数、字节码文件对应的Java版本号访问标识父类和接口

         魔数:文件是无法通过文件扩展名来确定文件类型的,文件扩展名可以随意修改,不影响文件内容。  软件打开的文件的头几个字节(文件头)去校验文件的类型,如果文件软件不支持该种类型就会出错。修改文件扩展名是不能修改文件头的。  在Java字节码文件中的文件头就被称为魔数,必须是0xcafebabe。

        主副版本号:指的是编译字节码文件的jdk版本号。主版本号用来标识大版本号。副版本号就是当主版本号相同时作为区分不同版本的标识,一般只需要关心主版本号。1.2之后大版本计算方法是:主版本号-44,比如主版本号是52就是jdk8。  版本号的作用主要是判断当前字节码的版本和运行时的jdk是否兼容。

 常量池:保存了字符串常量、类或接口名、字段名主要在字节码指令中使用。作用是:避免相同内容重复定义,节省空间。

 字段:当前类或接口声明的字段信息。

 方法:当前类或接口声明的方法信息字节码指令

 属性:类的属性,比如源码的文件名内部类的列表等等。

查看字节码文件常用工具:

  1、本地文件用java-v命令:是jdk自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件的内容。如果是jar包需要先使用jar-xvf命令解压。

  2、开发环境用idea的jclasslib插件:

jclasslib下载:打开idea的setting,

  jclasslib的使用:

首先在idea中写好一份简单代码:

package org.example;

public class text1 {
    static {
        System.out.println("text1...静态代码块");
    }

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

首先选中要查看的类, 然后点击view选项中的show bytecode with jclasslib 

就可以查看了。

 

  3、服务器环境用arthas:arthas是 一款先上个监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息(即查看运行中程序的字节码文件),并能在不修改应用代码的情况下,对业务问题进行诊断,大大提升线上问题排查效率。

   我们下载了arthas的jar包后,需要在我们安装的jdk路径下运行java-jar运行该jar包,否则会报错找不到某个文件。我用的mac.

首先先加上一行代码,让程序一直处于运行状态。

package org.example;

import java.io.IOException;

public class text1 {
    static {
        System.out.println("text1...静态代码块");
    }

    public static void main(String[] args) throws IOException {
        int i=0;
        System.out.println(i);

        System.in.read();
    }
}

运行该程序。 

然后我们就可以去启动arthas  jar包了,我把arthas jar包放在了桌面上。

先切换到Desktop界面,然后再用jdk路径的java -jar命令运行jar包。 

 然后回车执行:

 图中它返回给我4个线程,前面的数字是它们的序号,冒号后面是线程号,线程的路径和类名。

我们刚刚执行的代码是org.example.text1类。我们想查看该类,就输入它的序号 4 然后回车就可以了

 这就是启动成功了。

arthas命令:

  dashboard 命令:当前系统的实时数据面板,启动后按ctrl+c退出。参数-i :设置刷新实时数据的时间间隔(ms),-n :刷新次数。   dashboard -i 1000 -n 1   意思是1s后刷新一次打开数据面板。

  dump加载类的字节码文件到特定路径。参数 -d :设置类文件的目标目录。

 jad :将一个运行中的类的字节码信息反编译称源代码。

 classloader :查看classloader的详细信息。

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

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

相关文章

树莓派4B安装安卓系统LineageOS 21(Android14)

1:系统下载 2:下载好镜像后,准备写入SD卡,我这边使用的是 balenaetcher 3:插入树莓派,按照指示一步一步进行配置,可以配置时区,语言。 注意点 1》:想返回的时候按F2 2》:进入系统…

解密C语言内存分配奥秘,遨游动态内存管理海洋

一.C语言内存分区 C语言内存区从低地址到高地址分为代码区、常量区、全局(静态)区、堆区、栈区。 1.栈区 栈区介绍 栈区由编译器自动分配释放,由操作系统自动管理,无须手动管理。栈区上的内容只在函数范围内存在,当…

【软件开发规范篇】JAVA后端开发编码命名规范

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

阿里云服务器(Ubuntu22)上的MySQL8更改为大小写不敏感

因为windows上默认的mysql8.0是大小写不敏感的,部署到服务器上之后发现ubuntu默认的是大小写敏感,所以为了不更改代码,需要将mysql数据库设置为大小写不敏感的。 !!!重要一定要做好数据库的备份&#xff0…

docker如何关闭证书认证

目录 前言关闭Docker认证的步骤修改pom 前言 当docker认证证书过期了,项目又要马上上线怎么办?重新生成证书,时间来不及,这时最快的方法就是关闭证书认证。 关闭Docker认证的步骤 停止Docker服务 systemctl stop docker编辑Do…

【C++】对文章分词,并对词频用不同排序方法排序,比较各排序算法效率(功能全面,通俗易懂)

文章分词 1.问题描述2.需求分析3.概要设计3.1 主程序流程3.2 函数调用关系 4.主函数实现4.1 main.h4.2 main.cpp 5. 函数实现5.1 processDic函数5.2 forwardMax函数5.3 countWordFreq函数5.4 quickResult函数5.5 其它排序算法效率…

异地组网、网络部署、无线覆盖,贝锐蒲公英一步到位

面对网络架构复杂的企业总部,分散在各地的分支机构,以及出差的远程办公人员,如何才能高效异地组网? 为了确保总部、分部网络实现远程稳定、高速互访,以及远程人员安全访问总部业务系统,基于自研SD-WAN的贝…

elementui el-date-picker禁止选择今年、今天、之前、时间范围限制18个月

1、禁止选择今年之前的所有年份 <el-date-pickerv-if"tabsActive 0":clearable"false"v-model"yearValue"change"yearTimeChange"type"year"placeholder"选择年"value-format"yyyy":picker-options…

手搓数组栈(C语言)

stack.h #pragma once#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> // 支持动态增长的栈 typedef int STDataType; typedef struct Stack {STDataType* a;int top; // 栈顶int capacity; // 容量 }Stack; //…

光伏储能系统的主要作用都有什么?

光伏储能系统&#xff0c;结合了光伏技术和储能技术&#xff0c;已经成为当今可再生能源领域的重要一环。它不仅在电力供应中扮演着关键角色&#xff0c;还在许多其他领域展现出其广泛的应用价值。本文将详细探讨光伏储能系统的主要作用。 首先&#xff0c;光伏储能系统在家庭住…

Java苍穹外卖03-Redis-营业状态-HttpClient-微信小程序开发-微信登录以及浏览

一、Redis入门 1.Redis简介 是对MySQL数据库的补充 2.下载安装 启动redis&#xff1a; 再开一个cmd&#xff1a;连接本地redis数据库 如果想连接其他地方的redis数据库&#xff1a;h为ip&#xff0c;p为端口 a为密码 3.数据类型 哈希适合存储对象&#xff0c;列表适合存储…

【问题实操】银河麒麟高级服务器操作系统实例,CPU软锁报错触发宕机

1.服务器环境以及配置 处理器&#xff1a; Kunpeng 920 内存&#xff1a; 256G DDR4 整机类型/架构&#xff1a; TaiShan 200 (Model 2280) 内核版本 4.19.90-23.8.v2101.ky10.aarch64 2.问题现象描述 两台搭载麒麟v10 sp1的机器均在系统CPU软锁报错时&#xff0c;触…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解&#xff0c;分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

迅睿CMS图集多文件Files调用指南

在构建企业网站、B2B/B2C商城&#xff0c;或任何功能性质以图片展示为主的平台时&#xff0c;使用多图或图集功能变得至关重要。特别是当展示大量产品的详细视图、项目案例图片&#xff0c;或任何需要以图集形式呈现的内容时&#xff0c;多文件Files功能便发挥着无可替代的作用…

Facebook的语言学:社交媒体如何影响我们的沟通方式

1. 引言 社交媒体已经成为人们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;不仅改变了人们之间的社交方式&#xff0c;也对我们的语言学产生了深远的影响。本文将深入探讨Facebook的语言学特点&#xff0c;以及它如何塑造和改变…

AI大模型探索之路-训练篇4:大语言模型训练数据集概览

系列文章目录&#x1f6a9; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 文章目录 系列文章目录&#x1f6a9;前言一、常用的预训练…

优秀的控制台厂家需要考虑哪些方面

在当今数字化时代&#xff0c;控制台已成为众多行业不可或缺的一部分。面对市场上众多的控制台厂家&#xff0c;如何选择合适的供应商成为了一个重要的问题。本文嘉德立将从需求分析、产品质量、价格、服务、口碑等多个方面&#xff0c;为您详细解析如何选择一家优秀的控制台厂…

珠宝品牌如何借助3D技术,成就营销破局之路?

随着电商的快速发展&#xff0c;一直以实体店销售为主的珠宝行业&#xff0c;也开始向线上销售转型&#xff0c;但珠宝作为客单价较高的商品&#xff0c;在线上销售的过程中&#xff0c;会面临图片展示效果不佳&#xff0c;无法亲身体验佩戴效果等问题。 而3D、VR、AR等技术的出…

数海启航:数学与人工智能的深度交织

在人类文明的长河中&#xff0c;数学始终扮演着探秘未知、构建理论框架的基石角色。随着科技的飞速发展&#xff0c;尤其是人工智能&#xff08;AI&#xff09;的兴起&#xff0c;数学与这一前沿领域的结合愈发紧密&#xff0c;成为推动AI进步的最强引擎。 一、数学&#xff1a…