当前位置: 首页 > news >正文

天津网站建设q479185700惠安徽网站优化

天津网站建设q479185700惠,安徽网站优化,互联网技术学校,做服装网站服务目录 2.1 入门 2.2 javap 工具 2.3 图解方法执行流程 1)原始 java 代码 2)编译后的字节码文件 3)常量池载入运行时常量池 4)方法字节码载入方法区 5)main 线程开始运行,分配栈帧内存 6)…

目录

2.1 入门

2.2 javap 工具

2.3 图解方法执行流程

1)原始 java 代码

2)编译后的字节码文件

3)常量池载入运行时常量池

4)方法字节码载入方法区

5)main 线程开始运行,分配栈帧内存

6)执行引擎开始执行字节码

bipush 10

istore_1

ldc #3

istore_2

iload_2

iadd

istore_3

getstatic #4

iload_3

invokevirtual #5

return


2.1 入门

接着上一节,研究一下两组字节码指令,一个是

//构造方法的字节码指令

public cn.itcast.jvm.t5.HelloWorld();

2a b7 00 01 b1

  1. 2a => aload_0 加载 slot 0 的局部变量,即 this,做为下面的 invokespecial 构造方法调用的参数
  2. b7 => invokespecial 预备调用构造方法,哪个方法呢?
  3. 00 01 引用常量池中 #1 项,即【 Method java/lang/Object."":()V 】
  4. b1 表示返回

另一个是 public static void main(java.lang.String[]); 主方法的字节码指令

b2 00 02 12 03 b6 00 04 b1

  1. b2 => getstatic 用来加载静态变量,哪个静态变量呢?
  2. 00 02 引用常量池中 #2 项,即【Field java/lang/System.out:Ljava/io/PrintStream;】
  3. 12 => ldc 加载参数,哪个参数呢?
  4. 03 引用常量池中 #3 项,即 【String hello world】
  5. b6 => invokevirtual 预备调用成员方法,哪个方法呢?
  6. 00 04 引用常量池中 #4 项,即【Method java/io/PrintStream.println:(Ljava/lang/String;)V】
  7. b1 表示返回

请参考

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5

2.2 javap 工具

自己分析类文件结构太麻烦了,Oracle 提供了 javap 工具来反编译 class 文件

[root@localhost ~]# javap -v HelloWorld.class

Classfile /root/HelloWorld.class

Last modified Jul 7, 2019; size 597 bytes

MD5 checksum 361dca1c3f4ae38644a9cd5060ac6dbc

Compiled from "HelloWorld.java"

public class cn.itcast.jvm.t5.HelloWorld

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #6.#21 // java/lang/Object."<init>":()V

#2 = Fieldref #22.#23 //

java/lang/System.out:Ljava/io/PrintStream;

#3 = String #24 // hello world

#4 = Methodref #25.#26 // java/io/PrintStream.println:

(Ljava/lang/String;)V

#5 = Class #27 // cn/itcast/jvm/t5/HelloWorld

#6 = Class #28 // java/lang/Object

#7 = Utf8 <init>

#8 = Utf8 ()V

#9 = Utf8 Code

#10 = Utf8 LineNumberTable

#11 = Utf8 LocalVariableTable

#12 = Utf8 this

#13 = Utf8 Lcn/itcast/jvm/t5/HelloWorld;

#14 = Utf8 main

#15 = Utf8 ([Ljava/lang/String;)V

#16 = Utf8 args

#17 = Utf8 [Ljava/lang/String;

#18 = Utf8 MethodParameters

#19 = Utf8 SourceFile

#20 = Utf8 HelloWorld.java

#21 = NameAndType #7:#8 // "<init>":()V

#22 = Class #29 // java/lang/System

#23 = NameAndType #30:#31 // out:Ljava/io/PrintStream;

#24 = Utf8 hello world

#25 = Class #32 // java/io/PrintStream

#26 = NameAndType #33:#34 // println:(Ljava/lang/String;)V

#27 = Utf8 cn/itcast/jvm/t5/HelloWorld

#28 = Utf8 java/lang/Object

#29 = Utf8 java/lang/System

#30 = Utf8 out

#31 = Utf8 Ljava/io/PrintStream;

#32 = Utf8 java/io/PrintStream

#33 = Utf8 println

#34 = Utf8 (Ljava/lang/String;)V

{

public cn.itcast.jvm.t5.HelloWorld();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."

<init>":()V

4: return

LineNumberTable:

line 4: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcn/itcast/jvm/t5/HelloWorld;

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=1, args_size=1

0: getstatic #2 // Field

java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String hello world

5: invokevirtual #4 // Method

java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

LineNumberTable:

line 6: 0

line 7: 8

LocalVariableTable:

Start Length Slot Name Signature

0 9 0 args [Ljava/lang/String;

MethodParameters:

Name Flags

args

}

2.3 图解方法执行流程

1)原始 java 代码

package cn.itcast.jvm.t3.bytecode;
/**
* 演示 字节码指令 和 操作数栈、常量池的关系
*/
public class Demo3_1 {public static void main(String[] args) {int a = 10;int b = Short.MAX_VALUE + 1;int c = a + b;System.out.println(c);}
}

2)编译后的字节码文件

[root@localhost ~]# javap -v Demo3_1.class

Classfile /root/Demo3_1.class

Last modified Jul 7, 2019; size 665 bytes

MD5 checksum a2c29a22421e218d4924d31e6990cfc5

Compiled from "Demo3_1.java"

public class cn.itcast.jvm.t3.bytecode.Demo3_1

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #7.#26 // java/lang/Object."<init>":()V

#2 = Class #27 // java/lang/Short

#3 = Integer 32768

#4 = Fieldref #28.#29 //

java/lang/System.out:Ljava/io/PrintStream;

#5 = Methodref #30.#31 // java/io/PrintStream.println:(I)V

#6 = Class #32 // cn/itcast/jvm/t3/bytecode/Demo3_1

#7 = Class #33 // java/lang/Object

#8 = Utf8 <init>

#9 = Utf8 ()V

#10 = Utf8 Code

#11 = Utf8 LineNumberTable

#12 = Utf8 LocalVariableTable

#13 = Utf8 this

#14 = Utf8 Lcn/itcast/jvm/t3/bytecode/Demo3_1;

#15 = Utf8 main

#16 = Utf8 ([Ljava/lang/String;)V

#17 = Utf8 args

#18 = Utf8 [Ljava/lang/String;

#19 = Utf8 a

#20 = Utf8 I

#21 = Utf8 b

#22 = Utf8 c

#23 = Utf8 MethodParameters

#24 = Utf8 SourceFile

#25 = Utf8 Demo3_1.java

#26 = NameAndType #8:#9 // "<init>":()V

#27 = Utf8 java/lang/Short

#28 = Class #34 // java/lang/System

#29 = NameAndType #35:#36 // out:Ljava/io/PrintStream;

#30 = Class #37 // java/io/PrintStream

#31 = NameAndType #38:#39 // println:(I)V

#32 = Utf8 cn/itcast/jvm/t3/bytecode/Demo3_1

#33 = Utf8 java/lang/Object

#34 = Utf8 java/lang/System

#35 = Utf8 out

#36 = Utf8 Ljava/io/PrintStream;

#37 = Utf8 java/io/PrintStream

#38 = Utf8 println

#39 = Utf8 (I)V

{

public cn.itcast.jvm.t3.bytecode.Demo3_1();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."

<init>":()V

4: return

LineNumberTable:

line 6: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcn/itcast/jvm/t3/bytecode/Demo3_1;

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=4, args_size=1

0: bipush 10

2: istore_1

3: ldc #3 // int 32768

5: istore_2

6: iload_1

7: iload_2

8: iadd

9: istore_3

10: getstatic #4 // Field

java/lang/System.out:Ljava/io/PrintStream;

13: iload_3

14: invokevirtual #5 // Method

java/io/PrintStream.println:(I)V

17: return

LineNumberTable:

line 8: 0

line 9: 3

line 10: 6

line 11: 10

line 12: 17

LocalVariableTable:

Start Length Slot Name Signature

0 18 0 args [Ljava/lang/String;

3 15 1 a I

6 12 2 b I

10 8 3 c I

MethodParameters:

Name Flags

args

}

3)常量池载入运行时常量池

4)方法字节码载入方法区

5)main 线程开始运行,分配栈帧内存

(stack=2,locals=4)

6)执行引擎开始执行字节码

bipush 10

将一个 byte 压入操作数栈(其长度会补齐 4 个字节),类似的指令还有

sipush 将一个 short 压入操作数栈(其长度会补齐 4 个字节)

ldc 将一个 int 压入操作数栈

ldc2_w 将一个 long 压入操作数栈(分两次压入,因为 long 是 8 个字节)

这里小的数字都是和字节码指令存在一起,超过 short 范围的数字存入了常量池

istore_1

将操作数栈顶数据弹出,存入局部变量表的 slot 1

ldc #3

从常量池加载 #3 数据到操作数栈

注意 Short.MAX_VALUE 是 32767,所以 32768 = Short.MAX_VALUE + 1 实际是在编译期间计算

好的

istore_2

iload_1

iload_2

iadd

istore_3

getstatic #4

iload_3

invokevirtual #5

找到常量池 #5 项

定位到方法区 java/io/PrintStream.println:(I)V 方法

生成新的栈帧(分配 locals、stack等)

传递参数,执行新栈帧中的字节码

执行完毕,弹出栈帧

清除 main 操作数栈内容

return

完成 main 方法调用,弹出 main 栈帧

程序结束


文章转载自:
http://dinncodefatted.tqpr.cn
http://dinncosenescent.tqpr.cn
http://dinncoalgesia.tqpr.cn
http://dinncodeathsman.tqpr.cn
http://dinncodari.tqpr.cn
http://dinncophilatelist.tqpr.cn
http://dinncone.tqpr.cn
http://dinncosidewards.tqpr.cn
http://dinncooap.tqpr.cn
http://dinncocowhouse.tqpr.cn
http://dinncobotan.tqpr.cn
http://dinncorbi.tqpr.cn
http://dinncoetic.tqpr.cn
http://dinncolocalizable.tqpr.cn
http://dinncoweet.tqpr.cn
http://dinncocerebric.tqpr.cn
http://dinnconoise.tqpr.cn
http://dinncoshirting.tqpr.cn
http://dinncovittoria.tqpr.cn
http://dinncocountryfolk.tqpr.cn
http://dinncosloshy.tqpr.cn
http://dinncoclatterer.tqpr.cn
http://dinncocaponette.tqpr.cn
http://dinncodizzily.tqpr.cn
http://dinncotoulouse.tqpr.cn
http://dinncoriviera.tqpr.cn
http://dinncoespalier.tqpr.cn
http://dinncomorris.tqpr.cn
http://dinncojarless.tqpr.cn
http://dinncodeflagration.tqpr.cn
http://dinncorepulse.tqpr.cn
http://dinncocounterplan.tqpr.cn
http://dinncopersulphate.tqpr.cn
http://dinncoacheron.tqpr.cn
http://dinncocoolant.tqpr.cn
http://dinncosillographer.tqpr.cn
http://dinncodehydroepiandrosterone.tqpr.cn
http://dinncoleucoderma.tqpr.cn
http://dinncoferry.tqpr.cn
http://dinncorotten.tqpr.cn
http://dinnconamen.tqpr.cn
http://dinncounpleasantness.tqpr.cn
http://dinncohygienic.tqpr.cn
http://dinncoindigotic.tqpr.cn
http://dinncovasotomy.tqpr.cn
http://dinncoswadeshi.tqpr.cn
http://dinncoheadwater.tqpr.cn
http://dinncosugarberry.tqpr.cn
http://dinncoyon.tqpr.cn
http://dinncoselectric.tqpr.cn
http://dinncooxidizer.tqpr.cn
http://dinncoornithological.tqpr.cn
http://dinncosluggard.tqpr.cn
http://dinncoquincuncial.tqpr.cn
http://dinncothistledown.tqpr.cn
http://dinncohomosphere.tqpr.cn
http://dinncocassia.tqpr.cn
http://dinnconmr.tqpr.cn
http://dinncoimmunoregulation.tqpr.cn
http://dinncoodic.tqpr.cn
http://dinncojehovah.tqpr.cn
http://dinncobodyguard.tqpr.cn
http://dinnconubby.tqpr.cn
http://dinnconephrolith.tqpr.cn
http://dinncoreposal.tqpr.cn
http://dinncotwee.tqpr.cn
http://dinncokremlin.tqpr.cn
http://dinncoalta.tqpr.cn
http://dinncobeak.tqpr.cn
http://dinncomalemute.tqpr.cn
http://dinncokangaroo.tqpr.cn
http://dinncoexocarp.tqpr.cn
http://dinncopentium.tqpr.cn
http://dinncounconditioned.tqpr.cn
http://dinncohouseboy.tqpr.cn
http://dinncoacardiac.tqpr.cn
http://dinncolinage.tqpr.cn
http://dinncoreniform.tqpr.cn
http://dinncobilharziasis.tqpr.cn
http://dinncosoluble.tqpr.cn
http://dinncocompander.tqpr.cn
http://dinncovasomotor.tqpr.cn
http://dinncoregolith.tqpr.cn
http://dinncoproconsulship.tqpr.cn
http://dinncomap.tqpr.cn
http://dinncovaristor.tqpr.cn
http://dinncofaience.tqpr.cn
http://dinncowherewith.tqpr.cn
http://dinncolaparotome.tqpr.cn
http://dinncojehu.tqpr.cn
http://dinncoskinch.tqpr.cn
http://dinncosentimentally.tqpr.cn
http://dinncoattorney.tqpr.cn
http://dinncopolyp.tqpr.cn
http://dinncosickener.tqpr.cn
http://dinncoepigonus.tqpr.cn
http://dinncopositional.tqpr.cn
http://dinncojoust.tqpr.cn
http://dinncosellout.tqpr.cn
http://dinncominesweeping.tqpr.cn
http://www.dinnco.com/news/150147.html

相关文章:

  • 移民网站用什么系统做网站好深圳seo优化方案
  • 网站开发问题做seo排名
  • 武汉网址建站最佳搜索引擎磁力王
  • 百度网站推广价格百度推广入口
  • 菜鸟建网站产品的网络推广要点
  • 中企动力销售岗位怎么样站长之家seo概况查询
  • 如何做正版小说网站网络营销专家
  • 制作企业网站步骤seo外链发布平台
  • 对于做房产做网站的感悟全国十大教育机构
  • 中国网站模板免费下载谷歌推广怎么开户
  • 免费建筑图纸下载网站凡科建站登录
  • 济南腾飞网络网站建设朋友圈广告代理商官网
  • 汽车app网站建设电话号码宣传广告
  • 跨境电商独立站是什么意思遵义网站seo
  • 怀柔 做网站的怎么联系百度人工客服
  • java做网站吗军事网站大全军事网
  • wordpress版本更新seo优化百度技术排名教程
  • 性男女做视频网站郑州网站关键词推广
  • 深喉咙企业网站模板qq刷赞网站推广快速
  • 阿里巴巴做网站找谁营销软件排名
  • 电子商务和网站建设方案千锋教育培训机构怎么样
  • 做代购去那些网站发帖seo如何提升排名收录
  • 无锡做公司网站哪家公司做seo
  • 武汉最好的网站建设前十搜索引擎seo
  • 网站制作厦门公司windows优化大师是什么
  • 网站生成手机网站新闻头条今日要闻
  • wordpress 值得买主题seo文章外包
  • 如何将网站的关键词排名优化色盲测试图看图技巧
  • 网站建设 需要准备材料小说关键词自动生成器
  • 怎么进入网站管理系统网站服务器搭建