首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏技术墨客

    JVM与字节——2进制流字节解析 原

    字节解析 结构 本位将详细介绍字节2进制结构和JVM解析2进制流的规范。 LineNumberTable"属性也有自己的格式,主要分为2部分,首先是开头2字节表示行号列表的长度。然后4个字节一组,前2字节表示字节行号,后2字节表示Java源码行号。 到此,2进制流的异常处理介绍完毕。 总结 Jvm识别字节的过程到此介绍完毕,按照这个识别过程可以理解JVM是怎么一步一步解析字节的。 能够理解字节和JVM的识别过程还可以帮助我们更深层次优化代码。无论Java代码写得再漂亮也要转换成字节去运行。从字节层面去看运行的方式,要比从Java源码层面更为透彻。 理解字节还有一个好处,更容易理解多线程的3个主要特性:原子性、可见性和有序性。比如new Object() 从字节层面一看就知道不具备原子性,指令重排的问题在字节层面也是一目了然。

    1.4K30发布于 2018-08-15
  • 来自专栏java、Spring、技术分享

    java字节

      我们都知道Java字节是JVM所使用的指令集。java字节可以分为如下几类: 操作数栈   Java 方法的栈桢分为操作数栈和局部变量区。 如下代码生所的字节: ? dup pop 指令常用于舍弃调用指令的返回结果。 Idc加载常量池中的例子 将局部变量区的值加载到操作数栈的指令   Java 虚拟机将局部变量区当成一个数组,依次存放 this 指针(仅非静态方法),所传入的参数,以及字节中的局部变量。 局部变量表的字节 iinc M, N指令,(其中 M为正整数,N为整数),用于操作局部变量区。 字节如下图所示: ? iinc例子 Java 相关指令 new: 后跟目标类,生成该类的未初始化的对象。

    2K20发布于 2018-09-11
  • 来自专栏linux驱动个人学习

    eBPF 概述:第 2 部分:机器和字节

    的 eBPF 字节,我们会发现它是 0x020015。 这个特定的字节非常频繁地被用来测试存储在 r0 中的函数调用的返回值;如果 r0 == 0,它就会跳过接下来的 2 条指令。 3. 重新认识字节 现在我们已经有了必要的知识来完全理解本系列第 1 部分中 eBPF 例子中使用的字节,现在我们将一步一步地进行详解。 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 还记得 0x020015 吗?这和第一节的字节是一样的。 现在,主要的问题是编写原始字节是很困难的,这非常像编写汇编代码,而且编写效果不高。

    54910编辑于 2023-11-24
  • 来自专栏Linux内核那些事

    eBPF 概述:第 2 部分:机器和字节

    的 eBPF 字节,我们会发现它是 0x020015。 这个特定的字节非常频繁地被用来测试存储在 r0 中的函数调用的返回值;如果 r0 == 0,它就会跳过接下来的 2 条指令。 3. 重新认识字节 现在我们已经有了必要的知识来完全理解本系列第 1 部分中 eBPF 例子中使用的字节,现在我们将一步一步地进行详解。 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 还记得 0x020015 吗?这和第一节的字节是一样的。 现在,主要的问题是编写原始字节是很困难的,这非常像编写汇编代码,而且编写效果不高。

    1.1K20发布于 2021-11-23
  • 来自专栏Java Study

    ASM字节技术

    ASM是一个java字节操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。 Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节(指令)。 二、如何使用ASM   ASM框架中的核心类有以下几个:   ① ClassReader:该类用来解析编译过的class字节文件。    ② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法,甚至可以生成新的类的字节文件。   

    1.2K00发布于 2020-08-02
  • 来自专栏IT派

    Python字节介绍

    (my_variable, 2)。 指令的参数为2,表示Python需要从栈顶部弹出两个位置参数; 那么被调用的函数将位于最前面,并且它也可以被弹出(对于涉及关键字参数的函数,会使用不同的指令 -- CALL_FUNCTION_KW - 访问和理解Python字节 如果你也想玩玩这个,Python标准库中的dis模块就非常有用了; dis模块为Python字节提供了一个“反汇编程序”,从而可以轻松获取人为可读的版本并查找各种字节指令 “原始”字节 - 不具有可读性字节 - 可以通过代码对象的co_code的属性来访问。如果您想尝试手动反汇编函数,则可以使用列表dis.opname从十进制字节值中查找相应字节指令的名称。 对于Python, 理解字节会有类似的效果 - 如果您可以预想到Python源代码会被转换成怎样的字节,你就可以更好地决定如何编写和优化它。

    1.9K30发布于 2018-07-30
  • 来自专栏奔跑的蛙牛技术博客

    什么是字节

    什么是字节 字节(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间字节是电脑里的数据量单位。 字节文件展示 ? image.png 首先了解一张图 java字节总览图 ? 常量池中主要存储2大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。 0×0015:由于常量池的数量不固定(n+2),所以需要在常量池的入口处放置一项u2类型的数据代表常量池数量。因此该16进制是21,表示有20项常量,索引范围为1~20。明明是21,为何是20呢? Access_Flag.png 后续可以参考java程序如何按照字节翻译

    2.2K30发布于 2018-09-05
  • 来自专栏采云轩

    ASM 字节增强

    u2 access_flags; u2 this_class; u2 super_class; u2 字节增强 字节增强技术就是一类对现有字节进行修改或者动态生成全新字节文件的技术。 核心类: ClassReader:读取字节并将其转换为内部数据结构。 ClassWriter:将内部数据结构转换回字节,允许对字节进行修改。 ClassVisitor:字节访问者接口,通过它可以在访问字节的过程中进行操作。 2、ASM 写字节时,要知道如何传参。 针对这两个问题,ASM 社区提供了工具 ASM ByteCode Outline。 Idea 中直接按装此插件,可以直接把源码转为 ASM 语法格式。

    91210编辑于 2024-01-03
  • 来自专栏吉林乌拉

    字节执行引擎

    在上一篇我们介绍了类加载器的相关功能,在这一篇中我们在分享一下虚拟机中的另一个非常重要的功能字节执行引擎。我们知道Java虚拟机的主要任务就是加载class文件并执行其中的字节。 加载class的功能是由类加载器实现的,那么执行其中字节的功能就是由字节执行引擎执行的。下图为虚拟机的基本结构图。 ? 虚拟机执行字节时,会监视程序中使用最频繁的代码,将其编译成本地机器代码,而其它的字节,继续保留为字节。 执行引擎是由硬件芯片构成,它用本地代码执行字节。 上面所说的都是不同执行引擎的的执行特性,但无论是哪一种执行引擎其中最基本的功能都是执行字节。 方法返回地址 当一个方法执行后,只有2种办法可以让虚拟机退出这个方法。它们分别是: 执行引擎遇到任意一个方法返回的字节指令,也就相当于return关键字。这种退出的方式叫做正常完成出口。

    77920发布于 2019-08-14
  • 来自专栏算法之名

    Java字节

    Java字节对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。每一个Java字节指令是一个byte数字,并且有一个对应的助记符。 其中有这么几行字节指令 0: ldc #2 //常量池中#2为500000,将500000压入栈 2: istore_1 3: sipush void print(char[] cs,short[] s) { System.out.println(s[0]); System.out.println(cs[0]); } 编译后的字节为 来看一下如下代码 public void print(byte i) { int k = i; long l = i; } 编译后的字节 public void print(byte) 对象/数组操作指令 Java是面向对象的程序设计语言,虚拟机平台从字节层面就对面向对象做了深层次的支持。

    1.1K20发布于 2020-05-26
  • 来自专栏程序员备忘录

    Java字节简介

    jvm运行的指令就是.class字节。所以通过学习字节的规范和规则能提升我们对代码执行过程的理解。 这里恶补一下字节相关的基础知识。 我们打开.class文件,发现字节都是十六进制的编码。 字节的组成有以下部分,正入上图所示,十六进制的字节中就包含这些部分 。如下图所示。 2.版本号:因为java有不同的版本,所以在java字节中也有标记。0000 0034两个字节就表示java1.8版本。 在字节中的十六进制关系如下图所示。 (5) 当前类名 访问标志后的两个字节,描述的是当前类的全限定名。这两个字节保存的值为常量池中的索引值,根据索引值就能在常量池中找到这个类的全限定名。 ,其字节中方法的执行和常量池和代码区有很大的联系。

    1.5K10编辑于 2022-08-11
  • 来自专栏工作专用1

    JS生成字节生成技术,用字节保护商业NodeJS源码!

    本文介绍一种NodeJS源代码保护方式:通过把nodejs代码转化为字节,用node启动字节文件的方式,保护nodejs源代码不泄漏。 为了防止源码泄漏带来的一系列令人不安的后果,这里介绍一种专门针对于nodejs源码的保护技术:将nodejs代码转化为字节文件。 通过v8虚拟机,可以将js代码编译为字节。而v8虚拟机是能够识别和直接运行该字节的。 因此,以下执行逻辑成为可能: 1、js代码 -> js字节 2、js字节 -> nodejs ->运行 实现代码 (例程) 生成字节文件的部分: var v8 = require('v8 ,读取、运行字节

    3.9K00发布于 2019-03-22
  • 来自专栏个人随笔

    Javap -c 字节解析

    类型值存入数组中 castore             将char类型值存入数组中 sastore             将short类型值存入数组中 wide指令 wide             使用附加字节扩展局部变量索引 dup2             复制栈顶部两个字长内容 dup2_x1 复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈 dup2_x2             复制栈顶部两个字长的内容 把int类型的数据转化为float类型 i2d             把int类型的数据转化为double类型 l2i             把long类型的数据转化为int类型 l2f             ,i2f,i2d,l2f,l2d,f2d(放宽数值转换) i2b,i2c,i2s,l2i,f2i,f2l,d2i,d2l,d2f(缩窄数值转换) 创建类实便:new 创建新数组:newarray,anewarray dup,dup2,dup_xl,dup2_xl,dup_x2,dup2_x2,swap 有条件转移: ifeq,iflt,ifle,ifne,ifgt,ifge,ifnull,ifnonnull,if_icmpeq

    87860发布于 2018-05-17
  • 来自专栏用户1337634的专栏

    Java字节修改 - javassist

    AOP的实现一般使用了动态代理和字节修改,本文介绍使用javassist实现类的创建和修改 添加依赖 <dependency> <groupId>org.javassist</groupId > <artifactId>javassist</artifactId> <version>3.28.0-GA</version> </dependency> 使用字节创建一个类 初始化 Method printName = person.getClass().getMethod("printName"); printName.invoke(person); 输出 miao~ mark 使用字节修改类 student = new Student(); student.greeting(); 输出 before greeting~ hello student after greeting~ 常见问题 字节修改类没有生效 需要调用修改的类CtClass.toClass,把修改的信息写入到类字节 attempted duplicate class definition for name: "XXX" 因为对应的类信息已经加载

    2.6K10发布于 2021-11-24
  • 来自专栏Android面试

    ASM字节插桩

    方案4:字节插桩 字节函数插桩目前有以下两种框架 ASM 思路:应用程序打包成APK之前会先编译成.class文件,然后打包成dex,最后组成apk。 ASM框架进行字节函数插桩 ============== 经过上述方案的对比,最终采用ASM进行字节插桩。主要是对代码的侵入低,可定制化配置(过滤采集页面,过滤时长,配置页面映射等)。 * 使用android提供的Transform API获取project的文件 * 检测到文件后缀为class的时候进行文件修改 \* ASM框架相应API进行字节读取和分析和插入 \* 后续如果缺少相应的控件,那么可以根据相应的控件进行添加对应的字节描述即可: 例如在APP中的底部控件为Google的design控件,添加: SDK\_API\_CLASS = "com/cage/ 相关视频推荐: 【Android组件化设计】字节插桩优化框架初始化速度 本文转自 https://juejin.cn/post/6844904194445426702,如有侵权,请联系删除。

    1.4K50编辑于 2021-11-27
  • 来自专栏深入理解Android

    android字节框架——AspectJ

    最常用的字节处理框架有 AspectJ、ASM 等等,它们的相同之处在于输入输出都是 Class 文件。 并且,它们都是 在 Java 文件编译成 .class 文件之后,生成 Dalvik 字节之前执行。 3.性能较低 AspectJ 在实现时会包装自己一些特定的类,它并不会直接把 Trace 函数直接插入到代码中,导致生成的字节比较大,影响性能,如果想对 App 中所有的函数都进行插桩,性能影响肯定会比较大 2)、execution:代表方法执行的位置,插入在函数体内部。 TAG, "okhttp chain.proceed 耗时:" + mOkHttpData.costTime); } // 4、记录当前请求返回的响应和响应数据大小

    1.4K20编辑于 2022-06-22
  • 来自专栏Java项目实战

    JVM 字节指令解析

    在平时的demo中,依靠字节顺序,解析程序执行流程,真正的执行顺序是字节的执行顺序,单线程下字节顺序是与程序书写顺序一致的,多线程环境下,共享变量的赋值读取顺序却不可掌握时机。 区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区,当Eden区再次出发GC的时候会扫描Eden区和form区,对这个区域进行垃圾回收,经过这次回收还活着的,复制到To区,对象年龄+1 2: 设置年轻代大小 -XX:MetespaceSize:设置元空间大小,元空间使用本地内存 垃圾收集器: 并行 串行 并发标记 G1 ZGC 1.串行垃圾回收器(Serial)单线程环境设计只用一个线程回收 2. G1不产生内存碎片 可精准控制停顿 字节指令解析 以Price问题为例 package com.kk; import org.junit.Assert; import org.junit.Before 将一个常量加载到操作数栈:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_ml、iconst_、lconst_、fconst_、dconst_。

    75810发布于 2020-02-19
  • 来自专栏全栈程序员必看

    什么是字节指令?

    字节指令简介: Java虚拟机的指令由一个字节长度的、代表着某种特定含义的数字(称为操作,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。 由于Java虚拟机采用面向操作数栈而不是寄存器的架构,所以大多数的指令都不包含操作数,只有一个操作。由于限制了Java虚拟机操作的长度为一个字节,所以指令集的操作总数不可能超过256条。 字节与数据类型:大部分与数据类型相关的字节指令,他们的操作助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表int,l代表long,s代表short等等。 与之类似在操作boolean、byte、short和char类型的数组时,也会转换为只用对应的int类型的字节指令来处理。 在Java虚拟机中,处理异常(catch)不是由字节来实现的,而是采用异常表(Code属性中)完成的。

    75030编辑于 2022-11-10
  • 来自专栏枕边书

    Java 动态字节技术

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机中,就可以被解释执行。 虽然我对 JVM 的字节语法不熟,但有大神开发了可以在 IDEA 里查看字节的插件:ASM Bytecode Outline ,在要查看的类文件里右键选择 Show bytecode Outline  即可以右侧的工具栏查看我们要生成的字节。 Instrument ---- 介绍 字节是修改完了,可是 JVM 在执行时会使用自己的类加载器加载字节文件,加载后并不会理会我们做出的修改,要想实现对现有类的修改,我们还需要搭配 Java 的另一个库 ; } } } 执行字节修改和转换的类。

    2.4K20发布于 2019-01-03
  • 来自专栏cwl_Java

    性能优化-JVM字节

    2、JVM字节 前面我们通过tomcat本身的参数以及jvm的参数对tomcat做了优化,其实要想将应用程 序跑的更快、效率更高,除了对tomcat容器以及jvm优化外,应用程序代码本身如果写的效率不高的 这个时候,就需要通过查看编译好的class文件中字节,就可以找到答案。 2.1、通过javap命令查看class文件的字节内容 首先,看一个简单的Test1类的代码: ? 通过javap命令查看class文件中的字节内容: ? 接下来我们通过字节的 方式进行探究。 首先,编写个示例: ? m1() 与 m2() 哪个方法的效率高? 依然是通过字节的方式进行探究。

    58310发布于 2020-02-13
领券