字节码

字节码指令表(查找使用)

我与影子孤独终老i 提交于 2019-12-14 22:20:46
字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4 将int型4推送至栈顶 0x08 iconst_5 将int型5推送至栈顶 0x09 lconst_0 将 long 型0推送至栈顶 0x0a lconst_1 将 long 型1推送至栈顶 0x0b fconst_0 将 float型0推送至栈顶 0x0c fconst_1 将 float型1推送至栈顶 0x0d fconst_2 将 float型2推送至栈顶 0x0e dconst_0 将 double型0推送至栈顶 0x0f dconst_1 将 double型1推送至栈顶 0x10 bipush 将单字节的常量值(Byte.MIN_VALUE ~ Byte.MAX_VALUE,即 -128~127)推送至栈顶 0x11 sipush 将短整型的常量值(Short.MIN_VALUE ~ Short.MAX_VALUE,即 -32768~32767)推送至栈顶 0x12 ldc

十分钟带你了解 Java 代码执行原理 对不懂说不

╄→гoц情女王★ 提交于 2019-12-14 22:19:19
对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。 在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么? 一、编写java源程序 java源文件:指存储java源码的文件。 先来看看如下代码: //MyTest被public修饰,故存储该java源码的文件名为MyTest public class MyTest { public static void main (String[] args){ System. out .println("Test Java execute process."); } } //由于MyTest被public修饰了,故Class A不能用public修饰 class A {} //由于MyTest被public修饰了,故Class B不能用public修饰 class B {} 1、java源文件名就是该源文件中public类的名称 2、一个java源文件可以包含多个类,但只允许一个类为public 二、编译java源代码 当java源程序编码结束后,就需要编译器编译。 安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,xxx.java文件) 和 java

JVM底层知识体系

Deadly 提交于 2019-12-14 21:21:41
jvm类加载机制:   加载----验证---准备----解析----初始化----使用-----卸载 一、java的理解   1、平台无关性   2、GC:垃圾回收机制,不用手动释放堆内存   3、语言特性:泛型,反射,lemda表达式   4、面向对象:封装、继承、多态   5、类库:并发库,集合,网络库,IO,NIO   6、异常处理:运行时异常、编译时异常 二、JVM如何加载.class文件  1.1、类从编译到执行的过程:     1、编译器将.java源文件编译为.class字节码文件     2、ClassLoader将字节码文件转换为JVM中的Class<T>对象     3、JVM利用Class<T>对象实例化为T对象。     1.2、ClassLoad的种类:   ClassLoader在java中非常重要,所有Class都是有类加载器进行加载的,作用就是从系统外部获得Class二进制流,交给Java虚拟机进行连接,初始化等操作。     1、BootStrapClassLoader:C++编写,加载核心库java.*     2、ExtClassLoader:Java编写,加载扩展库javax.*     3、AppClassLoader:Java编写,加载程序所在目录。加载类路径下(ClassPath)的类库     4、自定义类加载器:通过继承 java

JVM 虚拟机字节码指令表速查

主宰稳场 提交于 2019-12-14 14:07:23
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 字节码 助记符 指令含义 0x00 nop None 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4 将int型4推送至栈顶 0x08 iconst_5 将int型5推送至栈顶 0x09 lconst_0 将long型0推送至栈顶 0x0a lconst_1 将long型1推送至栈顶 0x0b fconst_0 将float型0推送至栈顶 0x0c fconst_1 将float型1推送至栈顶 0x0d fconst_2 将float型2推送至栈顶 0x0e dconst_0 将double型0推送至栈顶 0x0f dconst_1 将double型1推送至栈顶 0x10 bipush 将单字节的常量值(-128~127)推送至栈顶 0x11 sipush 将一个短整型常量(-32768~32767)推送至栈顶 0x12 ldc 将int,float或String型常量值从常量池中推送至栈顶 0x13 ldc_w

Java程序运行机制

冷暖自知 提交于 2019-12-14 12:42:24
Java程序运行机制 编译型(compile) 它有一个负责翻译的程序(编译器),将我们写的 Java 源代码转为计算机可执行的代码 举个例子:把一本中文书翻译成英文书 应用:操作系统、C、C++ 解释型 编写一次则解释一次 举个例子:翻译官,客户说一句同时翻译一句 应用:网页 程序运行机制 源程序( .java 文件)--> Java 编译器 字节码( *.class 文件 )--> 类装载器 --> 字节码校验器 -->解释器 --> 操作系统平台 来源: https://www.cnblogs.com/2019-12-12-lcl/p/12038706.html

深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析

拟墨画扇 提交于 2019-12-14 11:48:17
来自:好好学java 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够讲解的透彻且形象。 0 运行时数据区域 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比,最大的差别就是: 元数据区取代了永久代 。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于: 元数据空间并不在虚拟机中,而是使用本地内存 。 1 程序计数器(Program Counter Register) 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的 行号指示器 。在虚拟机概念模型中,

Java的消亡史

随声附和 提交于 2019-12-14 11:07:54
作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译、类加载、运行、GC。 编译 Java语言的编译期其实是一段“不确定 ”的过程,因为可能是一个前端编译器把.java文件转变为.class文件的过程;也可能是指JVM的后端运行期编译器(JIT编译器)把字节码转变为机器码的过程;还可能是指使用静态提前编译器(AOT编译器)直接把.java文件编译成本地机器码的过程。但是在这里我们说的是第一类。也是符合我们大众对编译认知的。编译在这个时间段经历了哪些过程呢? 词法、语法分析 词法分析是将源代码的字符流转变为Token集合,而语法分析则是根据Token序列抽象构造语法树(AST)的过程,AST是一种用来描述程序代码语法结构的树形表示形式,语法树的每个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值甚至代码注释都可以是一个语法结构。 填充符号表 完成了语法和词法分析之后,下一步就是填充符号表的过程,符号表中所登记的信息在编译的不同阶段都要用到。在这里延伸一下符号表的概念。符号表是什么呢?它是由一组符号地址和符号信息构成的表格,最简单的可以理解为哈希表的K-V值对的形式。为什么会用到符号表呢?符号表最早期的应用之一就是组织程序代码的信息

ASMSupport教程4.12 生成方法调用操作

我的梦境 提交于 2019-12-13 22:18:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> <p>这一节我们讲如何用ASMSupport生成方法调用的操作,方法调用包括下面四种类型:</p> <ol> <li>调用构造方法 <li>调用静态方法 <li>调用非静态方法 <li>调用当前类的方法 <li>调用父类方法</li></ol> <p>首先我们需要看我们想要生成的类:</p> <p>代码1:</p> <h3> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:8ef33b82-d2bb-4577-8993-178c1b8d44f7" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: java; gutter: true; first-line: 1; tab-size: 4; toolbar: true; width: 796px; height: 519px;" style=" width: 796px; height:

ASMSupport教程1:简单的HelloWorld

落爺英雄遲暮 提交于 2019-12-13 22:17:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这里不做过多解释,先通过下面的代码生成一个class,再通过反射调用其main方法,感受下ASMSupport的奇妙 1.首先创建一个抽象类 public abstract class AbstractExample { /** * system.out global variable */ public static GlobalVariable systemOut = AClassFactory.getProductClass(System.class).getGlobalVariable("out"); public static Class<?> generate(IClassContext creator){ //_这是Class的输出路径。主要为了调试作用。我们通过asmsupport生成的class将获输出到这个路径 //你可以通过反编译软件看看我们生成的结果 creator.setClassOutPutPath(".//target//"); //这个就是个开关。前面我们把该创建的方法变量都放到了传送带上了。调用startup //启动传送带,将上面的东西一个个处理给我返回一个我们需要的成品(就是class了) Class<?> cls = creator.startup(); /

ASMSupport教程4:动态生成类

泪湿孤枕 提交于 2019-12-13 22:13:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有一段时间没有写blog了,主要原因是前段时间去西安旅游了。好了进入正题。这个篇blog将学习到如何生成一个Class。并且在这个Class中添加局部变量和各种类型的方法。 首先我们看下要生成的class对应的java代码是什么: <!-- lang: java --> public class CreateClassExample { private static String staticGlobalVariable = "I'm a static global variable at class"; public int globalVariable; public CreateClassExample(int intVal) { this.globalVariable = intVal; } private void commonMethod() { System.out.println("staticGlobalVariable : " + staticGlobalVariable); System.out.println("globalVariable : " + this.globalVariable); } public static void main(String[] args) { new