最近在研究JVM字节码,发现在对字节码反编译后出现了 StackMapTable 这样一个结构,因此这里研究一下这个到底是做什么用的。

首先说下栈图这个东西在哪里,这是我最近在学习java 字节码的时候发现的一个东西。当我在 Idea 中使用反编译选项对 java.util.HashMap类进行反编译时,读取到了这样的字节码:

如图FRAME APPENDFRAME SAME这样的代码并不是标准的字节码指令,因此有可能是 Idea 的反编译器为了代码的可读性,自动给我们增加的内容。从字面意义上解读的话应该是字节码运行到这里的时候,在帧中追加变量 java.util.HashMap&Node 但由于没有给出变量的地址,因此又好像不是。为了验证,这里做了一番研究。

首先,如果我们直接使用 javap反编译相同的代码时,相同位置并没有类似的字节码。可以肯定这部分的确是 Idea 反编译器加上去的。

栈图(StackMapTable)

栈图是 JDK1.6 之后引入的一个JVM特性,主要用于提高 JVM 在加载类时对局部变量表中的类型验证效率。栈图结构位于 Code 的属性表结构中(attributes table) 。位于 JVM 规范的 JSR202文档中,里面描述了一种新的字节码校验算法,“类型检查”,在此之前使用的是 “类型推导"的算法。下图为字节码校验的阶段:

为了支持新算法,class 文件从版本 50 开始添加了一个新的属性表,叫做 StackMapTable,里面记录了一个方法中操作数栈与局部变量区的类型在一些特定位置的状态。

上图为 java.util.HashMap 类中 treeifyBin 方法的栈映射帧,从 JDK6 开始,如果方法的字节码中没有该属性,则会默认为其分配一个相关属性。可以看到栈映射帧中存在 FrameAppendFrameSame等类型指的是 StackMapFrame,这个 Frame 与 Java 方法调用栈的栈帧不同。而是拥有表述该调用栈状态的一种数据结构,会在 class 文件加载时利用该属性进行校验。注意这里所谓的 FrameAppend ,FrameChop 都是对同一个方法的栈帧而言的,并不是说 “添加栈帧”、“减少栈帧"或者"压入栈帧”,弹出"栈帧”,而是指栈桢的内容(局部变量表)在数量上有所变化。

参考资料

bytecode viewer介绍
jclasslib
Java JVM 栈帧(Stack Frame)
栈帧
JVM的StackMapTable的前世今生
StackMapTable属性说明
StackMapTable属性的运作原理

JVM 字节码 栈图(Stack Map Table) 学习笔记相关推荐

  1. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  2. 深入理解JVM字节码(一)

    目录 深入剖析Class文件结构 一.初探class文件 二.class文件结构剖析 (一) 魔数 (二) 版本号 (三) 常量池 1. CONSTANT_Integer_info和CONSTANT_ ...

  3. JVM字节码指令集大全及其介绍

    Java是怎么跨平台的 我们上计算机课的时候老师讲过:"计算机只能识别0和1,所以我们写的程序要经过编译器翻译成0和1组成的二进制格式计算机才能执行".我们编译后产生的.class ...

  4. 【JVM · 字节码】指令集 解析说明

    1. 概述 Java字节码指令对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令. Java虚拟机的指令由 一个字节长度 的.代表着某种特定操作含义的数字(称为 操作码/Opcode)以及跟随其后 ...

  5. 2个字节能存多少个16进制_初探JVM字节码 - 疾风老头

    作者: LemonNan 原文地址: 代码地址: 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 c ...

  6. 深入理解JVM字节码(二)

    目录 字节码基础 一.字节码概述 二.Java虚拟机栈和栈帧 栈帧 1. 局部变量表 2. 操作数栈 三.字节码指令 1. 加载和存储指令 2. 操作数栈指令 3. 对象相关的字节码指令 1. ``方 ...

  7. JVM之Java栈Java stack

    JVM之Java栈Java stack 目录: JVM体系结构概览 JVM之Java栈解析 1. JVM体系结构概览 2. JVM之Java栈解析 stack图 先简单认识,图示在一个栈中有两个栈帧: ...

  8. Android自动化埋点(一) - JVM字节码

    JVM字节码 开头 这一系列文章,主要是讲自动化埋点又叫无痕埋点,或者字节码插桩技术,写这个系列文章的目的是 偶然间发现,网上关于这方面的博客很少,所以我根据自己的一些实战经验,整理了这个系列的文章. ...

  9. Java生产环境下性能监控与调优详解 第8章 JVM字节码与Java代码层调优

    第8章 JVM字节码与Java代码层调优 8-1 jvm字节码指令-1 8-2 jvm字节码指令-2 8-3 i++与++i 8-4 字符串+拼接 8-5 Try-Finally字节码 8-6 Str ...

  10. java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码

    有了前面一系列的铺垫和准备后,我们终于能走到至关重要的一刻.在本节,我们将用C语言开发快速排序算法,然后利用我们的编译器把它编译成java字节码,让C语言编写的快速排序算法能在java虚拟机上顺利执行 ...

最新文章

  1. c语言计算器实现简单的四则运算.(加,减,乘,除)实验报告,C语言数据结构“简单计算器。”1、简单计算器。请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程...
  2. java播放声音和图片的代码_java怎么将出片处理成老照片?怎么播放声音?
  3. 第3章 简单爬虫架构
  4. Java有序表查找:折半查找、二分查找、差值查找和斐波那契查找
  5. mediastream2使用指南(转载)
  6. 铃木uy125摩托车机油_UY125 新瑞梦UM125发布 济南铃木于湖南株洲吹响国IV集结号...
  7. 云计算架构设计6大原则,你遵循了吗?| 赠书
  8. vue-cli webpack 引入jquery
  9. 浏览器上跑:TensorFlow发布实时人物分割模型,秒速25帧,24个部位
  10. 网易云解析接口PHP源码,网易云解析/接口
  11. 6个功能杰出的黑科技APP, 每一个都令你大开眼见!
  12. 十代主板改win7_微星(MSI)z490主板装win7系统及bios设置教程(支持10代usb驱动)
  13. Oracle开发专题之:OLAP 函数 (rows 2 preceding / unbounded preceding)
  14. c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
  15. 六级听力技巧与备考策略
  16. 原创科幻短篇《霾星》
  17. 数据库连接中的等值连接、自然连接、外连接、左外连接和右外连接
  18. linux搭建智能dns步骤,Linux下智能DNS配置过程
  19. SDUT—Python程序设计实验五(列表与元组)
  20. notepad++的JSONviewer插件

热门文章

  1. vb.net 教程 3-8 窗体编程 容器 3 SplitContainer
  2. myelicpes2019初次使用设置_实况足球2019球员数据编辑器怎么使用
  3. 如何把书上的字弄到电脑!
  4. 关于shopex网店系统和网店助理的几点优化建议
  5. SIM900A模块与PC如何连接?
  6. LoadRunner教程(28)-LoadRunner连接mysql
  7. 一些牛人博客,值得收藏和学习
  8. c++ 代码_C|函数调用约定与堆栈平衡的汇编代码分析
  9. linux 搭建文件服务器(vsftpd)
  10. 从Q2财报,看携程的内容“元宇宙”