JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)— Java 字节码基础之二
介绍
版本:Java SE 7
为什么需要了解 Java 字节码?
无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基础。
总监、管理者和非技术人员可以放轻松点:他们所要知道的就是开发团队在正在进行下一版的开发,Java 字节码默默的在 JVM 平台上运行。
简单地说,Java 字节码是 Java 代码(如,class 文件)的中间表现形式,它在 JVM 内部执行,那么为什么你需要关心它?因为如果没有 Java 字节码,Java 程序就无法运行,因为它定义了 Java 开发者编写代码的方式。
从技术角度看,JVM 在运行时将 Java 字节码以 JIT 的编译方式将它们转换成原生代码。如果没有 Java 字节码在背后运行,JVM 就无法进行编译并映射到原生代码上。
很多 IT 的专业技术人员可能没有时间去学习汇编程序或者机器码,可以将 Java 字节码看成是某种与底层代码相似的代码。但当出问题的时候,理解 JVM 的基本运行原理对解决问题非常有帮助。
在本篇文章中,你会知道如何阅读与编写 JVM 字节码,更好的理解运行时的工作原理,以及结构某些关键库的能力。
本篇文章会包括一下话题:
- 如何获得字节码列表
- 如何阅读字节码
- 语言结构是如何被编译器映射的:局部变量,方法调用,条件逻辑
- ASM 简介
- 字节码在其他 JVM 语言(如,Groovy 和 Kotlin)中是如何工作的
目录
- 为什么需要了解 Java 字节码?
- 第一部分:Java 字节码简介
- 基础
- 基本特性
- JVM 栈模型
- 方法体里面是什么?
- 局部栈详解
- 局部变量详解
- 流程控制
- 算术运算及转换
- new & &
- 方法调用及参数传递
- 第二部分:ASM
- ASM 与工具
- 第三部分:Javassist
- 总结
ASM
ObjectWeb ASM 事实上是 Java 字节码分析和操作的标准。ASM 通过它面向访问者的 API 暴露 Java 类的内部聚合组件。API 本身不是很广泛 - 只需要使用一部分类,就可以实现几乎所有想要的。ASM 可以用来修改二进制字节码,以及生成新的字节码。例如,ASM 可以应用到新的编程语言(Groovy、Kotlin、Scala),将高级程序语言的语法编译成可供 JVM 执行的字节码。
“We didn’t even consider using anything else instead of ASM, because other projects at JetBrains use ASM successfully for a long time.”
– ANDREY BRESLAV, KOTLIN
My first touch with bytecode first hand was when I started helping in the Groovy project and by then we settled to ASM. ASM can do what is needed, is small and doesn’t try to be too smart to get into your way. ASM tries to be memory and performance effective. For example you don’t have to create huge piles of objects to create your bytecode. It was one of the first with support for invokedynamic btw. Of course it has its pro and con sides, but all in all I am happy with it, simply because I can get the job done using it.
– JOCHEN THEODOROU, GROOVY
I mostly know about ASM, just because it’s the one used by Groovy
JVM 内部原理(七)— Java 字节码基础之二的更多相关文章
- JVM 内部原理(六)— Java 字节码基础之一
JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- JVM(三):深入分析Java字节码-上
JVM(三):深入分析Java字节码-上 字节码文章分为上下两篇,上篇也就是本文主要讲述class文件存在的意义,以及其带来的益处.并分析其内在构成之一 ---字节码,而下篇则从指令集方面着手,讲解指 ...
- Java字节码浅析(二)
英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 条件语句 像if-else, switch这样的流程控制的条件语句,是通过用一条指令来进行两个值的比较,然后根据结果跳转到另一条字 ...
- Java字节码基础[转]
原文链接:http://it.deepinmind.com/jvm/2014/05/24/mastering-java-bytecode.html Java是一门设计为运行于虚拟机之上的编程语言,因此 ...
- 从零写一个编译器(十一):代码生成之Java字节码基础
项目的完整代码在 C2j-Compiler 前言 第十一篇,终于要进入代码生成部分了,但是但是在此之前,因为我们要做的是C语言到字节码的编译,所以自然要了解一些字节码,但是由于C语言比较简单,所以只需 ...
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...
- 面试突击(七)——JVM如何加载Java字节码信息的?
声明:本文图片均来自网络,我只是进行了选择,利用一图胜千言的力量来帮助自己快速的回忆相关的知识点 1:先看一下Java类文件的转换过程,如下所示,Java字节码文件是通过类加载子系统来放入JVM的内存 ...
- JVM 内部原理系列
JVM 内部原理(一)— 概述 JVM 内部原理(二)— 基本概念之字节码 JVM 内部原理(三)— 基本概念之类文件格式 JVM 内部原理(四)— 基本概念之 JVM 结构 JVM 内部原理(五)— ...
- JVM 内部原理(二)— 基本概念之字节码
JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...
随机推荐
- VB.Net中确认退出对话框的实现
实现方法分为两大类:窗体事件和控件事件,下面就一一展示: 一.FormClosing事件(又分以下几种方法) a. Private Sub frmPractise_FormClosing(ByVal ...
- Python初识及变量
第一句python,输出 Hello world #!/usr/bin/evn python #指定解释器 #_*_ coding:utf- _*_ #指定编码 print("hello w ...
- Filebeat 快速开始
Filebeat可以做什么 条目 filebeat 编写语言 GO 是否支持多输出 支持 是否支持多输入 支持 是否支持修改日志内容 支持 是否会丢数据 不会 对多行文件的合并 支持 对多层目录的模糊 ...
- SimpleDateFormat 格式化参数说明
字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 w 年中的周数 Number 27 W ...
- Linux学习笔记10—Linux下chkconfig命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...
- 使用 IntraWeb (31) - IntraWeb 的 Xml 操作使用的是 NativeXml
在 IWNativeXml 单元. 知道了这个, 以后在其他 Delphi 程序中也可以直接 Uses IWNativeXml 了. TNativeXml (IWNativeXml.TNativeXm ...
- Knockout.Js官网学习(checked 绑定)
前言 checked绑定是关联到checkable的form表单控件到view model上 - 例如checkbox(<input type='checkbox'>)或者radio bu ...
- Docker修改daemon.json后无法启动的问题
本文的运行环境为Centos 7.3,Docker与Kubernetes的安装方式见kubeadm安装kubernetes V1.11.1 集群 最近在整理Docker和Kubernetes中的日志与 ...
- Linux终端记录神器
我们在调试程序的时候,免不了要去抓一些 log ,然后进行分析.如果 log 量不是很大的话,那很简单,只需简单的复制粘贴就好.但是如果做一些压力测试,产生大量 log ,而且系统内存又比较小(比如嵌 ...
- 转: chrome64打开弹出窗flash的办法
https://jingyan.baidu.com/article/380abd0a38f0411d90192c2e.html