理解Android虚拟机dex指令
创始人
2025-06-01 03:18:25
0

前言

内存结构
内存结构
CPU不可以直接操作堆区数据,需要通过中间高速缓存区进行相关数据操作;

dex指令理解

我们知道Android虚拟机执行的是dex指令,我们可以先使用javac指令编译class,再通过dx指令编译查看对应java方法的dex指令;

  1. 局部变量方法调用dex指令查看;
public class Person {public void run() {Person  person = new Person();person.run();}
}

编译成Person.class文件后,使用dx --dex --verbose --dump-to=a.txt --dump-method=Person.run --verbose-dump Person.class dx指令编译Person.run方法,删除无用信息后,得到文件内容以及解释如下:

Person.run:()V:
regs: 0002; ins: 0001; outs: 00010000: new-instance v0, Person //  1.在高速缓存中声明一个v0;2.将Person.class加载到方法区;3.在堆区实例化一个对象person;4.v0指向堆区的person对象;0002: invoke-direct {v0}, Person.:()V // 调用构造方法初始化person对象,并将返回值赋给v00005: invoke-virtual {v0}, Person.run:()V // 调用v0执行person.run方法;0008: return-void //返回void
  1. 全部全量方法调用dex指令查看;
public class Person {Person person;public void run() {person = new Person();person.run();}
}

编译成Person.class文件后,使用dx --dex --verbose --dump-to=a.txt --dump-method=Person.run --verbose-dump Person.class dx指令编译Person.run方法,删除无用信息后,得到文件内容以及解释如下:

Person.run:()V:
regs: 0002; ins: 0001; outs: 00010000: new-instance v0, Person   //  1.在高速缓存中声明一个v0;2.将Person.class加载到方法区;3.在堆区实例化一个对象person;4.v0指向堆区的person对象;0002: invoke-direct {v0}, Person.:()V    // 调用构造方法初始化person对象,并将返回值赋给v00005: iput-object v0, v1, Person.person:LPerson;    //将v0赋值v1,则全局变量person(v1)就指向了堆区中的实例对象;0007: iget-object v0, v1, Person.person:LPerson;   //由于cpu不能直接使用堆区数据(v1),cpu将v1的值又读了一遍到v0中;0009: invoke-virtual {v0}, Person.run:()V // 调用v0执行person.run方法;000c: return-void

Q:为什么DCL单例需要使用 volatile关键字修饰?

A:当指令进行了重排,可能会出现Person.:()V 指令在
0005: iput-object v0, v1, Person.person:LPerson 0007: iget-object v0, v1, Person.person:LPerson; 指令之后的情况,就会导致没有调用构造方法就使用了person对象的情况,而从引起问题;

结语

如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )

相关内容

热门资讯

狂砸3191亿港元!2025港... 2025年已经收官,港股全年回购数据正式出炉。券商中国记者根据数据统计,2025年全年有307家H股...
车企2026开年大促,含16个... 红星资本局1月2日消息,2026年开年,宝马大范围下调建议零售价,为车市竞争再添一把火。据红星资本局...
三花智控:生意不起眼,凭什么总... 关注人形机器人产业链,就无法绕过三花智控。尤其是特斯拉Optimus距离量产阶段越来越近,三花智控作...
独家|宗馥莉重任宏胜集团法定代... 1月2日晚间,《每日经济新闻》记者独家获悉,近日,宗馥莉重新担任宏胜饮料集团有限公司(以下简称宏胜集...
2026年,开门红! 今天是1月2日,星期五,港股在新年首个交易日显著上涨。恒生指数大涨了2.76%,收于26338.47...
冲破垄断,商业航天、机器人双巨... 芯动联科,脱颖而出!宇树机器人在王力宏演唱会上的高难度舞姿,不仅点燃科技娱乐融合热潮,更揭开了人形机...
张朝阳,把自己放进产品里 定焦One(dingjiaoone)原创作者 | 张星星编辑 | 阮梅当时间的指针划向2026年,又...
大手笔买不停!江南化工花6.4... 本报(chinatimes.net.cn)记者何一华 李未来 北京报道江南化工(002226.SZ)...
总装机容量100万千瓦 年均发... 昨天(1月1日)记者获悉,位于四川省甘孜藏族自治州理塘县雅砻江流域的索绒光伏电站建成投产,电站场址平...
一键收藏!2026年赛事日历来... 来源:新华网客户端