ldc java_Java进阶干货分享:深入JVM指令手册(一)
JVM在Java进阶中有多重要,相信每一位学习Java的同学都了解,上篇内容说到了JVM内存模型详解,还是有同学留言说挺实用的。
昨天,在交流群里和大佬们交流的时候,发现现在学到jvm这块进阶内容的时候,很多人对指令手册不是很了解。
还被大佬们调侃,因为这也是我当初学进阶课程时,jvm版块的一个难点,也是群里的大佬们协助解决的。
所以,今天就来和大家说一下这块的内容,主要分为三篇文章来和大家说,有兴趣的小伙伴可以持续关注。想学习大佬们经验或者想向大佬们请教的,我这边也给到大家方法,大家自行获取。
一、未归类系列A
此系列暂未归类。
二、const系列
该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈 顶时,才使用如下的命令。
比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5)
送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)。
三、push系列
该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。
注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc 命令系列。
四、ldc系列
该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面需要给一个表示常量在常量池中位置(编号)的参数,
哪些常量是放在常量池呢?比如:final static int id=32768;final static float double=6.5。
对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中.
另外,所有不是通过new创建的String都是放在常量池中的。
五、load系列
5.1、load系列A
该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型, 还可以是引用类型。
对于前四个本地变量可以采用iload_0,iload_1,iload_2,iload_3(它们分别表示第0,1,2,3个整形变量)这种不到参数的简化命令形式。
对于第4以上的本地变量将使用iload命令这种形式,在它后面给一参数,以表示是对第几个(从0开始)本类型的本地变量进行操作。
对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。
对于非静态函数,第一变量是this,即其对于的操作是aload_0.
还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。
5.2、load系列B
该系列命令负责把数组的某项送到栈顶。该命令根据栈里内容来确定对哪个数组的哪项进行操作。
比如,如果有成员变量:final String names[]={"robin","hb"};
那么这句话:String str=names[0];对应的指令为
六、store系列
6.1、store系列A
该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类型,还可以是引用类型。
如果是把栈顶的值存入到前四个本地变量的话,采用的是istore_0,istore_1, istore_2,istore_3(它们分别表示第0,1,2,3个本地整形变量)这种不到参数的简 化命令形式。如果是把栈顶的值存入到第四个以上本地变量的话,将使用istore 命令这种形式,在它后面给一参数,以表示是把栈顶的值存入到第几个(从0开 始)本地变量中。
对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。
对于非静态函数,第一变量是this,它是只读的.
还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。
6.2、store系列B
该系列命令负责把栈顶项的值存到数组里。该命令根据栈里内容来确定对哪个数组的哪项进行操作。
比如,如下代码:
int moneys[]=new int[5];
moneys[1]=100;
其对应的指令为:
49:iconst_5
50:newarray int
52:astore11
54:aload11
56:iconst_1
57:bipush100
59:iastore
60:lload6//因为str在我的程序中是其所非静态在函数的第6个变量(从0开始计数).
七、pop系列
该系列命令似乎只是简单对栈顶进行操作,更多详情待补充。
八、栈顶元素数学操作及移位操作系列
该系列命令用于对栈顶元素行数学操作,和对数值进行移位操作。移位操作的操作数和要移位的数都是从栈里取得。
比如对于代码:int k=100;k=k>>1;其对应的JVM指令为:
60:bipush100
62:istore12//因为k在我的程序中是其所在非静态函数的第12个变量(从0开始计数).
64:iload12
66:iconst_1
67:ishr
68:istore12
关于JVM指令手册内容将分为3篇文章给大家,有需要的可以持续关注,我这边也有关于进阶的大佬交流群,任何关于Java相关的内容都可以在群内咨询,大佬们都会积极解决。
很多人在学习Java的过程中会忽略这一块的知识,如果想要通过进阶获得高薪酬的工作,肯定是各个内容都需要掌握,希望这篇文章能够帮助到大家。
ldc java_Java进阶干货分享:深入JVM指令手册(一)相关推荐
- jmap 文件解析_干货分享丨jvm系列:dump文件深度分析
摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...
- 【华为云技术分享】干货分享丨jvm系列:dump文件深度分析
摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...
- JVM指令分析实例四(数组、switch)
本篇为<JVM指令分析实例>的第四篇,相关实例均使用Oracle JDK 1.8编译,并使用javap生成字节码指令清单. 前几篇传送门: JVM指令分析实例一(常量.局部变量.for循环 ...
- eureka 之前的服务如何关闭_干货分享 | 服务注册中心Spring Cloud Eureka部分源码分析...
友情提示:全文13000多文字,预计阅读时间10-15分钟 Spring Cloud Eureka作为常用的服务注册中心,我们有必要去了解其内在实现机制,这样出现问题的时候我们可以快速去定位问题.当我 ...
- android 移除泛型中元素_最新(2020)Android高级面试知识点干货分享(二)
最新Android高级面试知识点干货分享(一) *转载请说明出处*! 四.Java集合(List.Set.Queue.Map) Java集合体系是一个树状,如果按照类似OSI网络模型来看的话,整个Ja ...
- 让0基础纯小白也能上手写Python,干货分享(二)
上一篇文章测试工程师进阶之Python学习干货分享分享了Python基础知识,本次继续分享其它内容. 一.Python基本数据类型 1.数值类型:整数.浮点数.复数. 2.序列类型:字符串.列表.元组 ...
- 干货分享:十年大厂资深程序员的开发经验总结
本文由腾讯云加社区整理和发布,原文链接:cloud.tencent.com/developer/article/1004735,内容有删减和改动. 1.引言 在互联网一线做了十年的程序开发,经历了网易 ...
- Netty干货分享:京东京麦的生产级TCP网关技术实践总结
1.引言 京东的京麦商家后台2014年构建网关,从HTTP网关发展到TCP网关.在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用.高性能.高稳定的 ...
- 干货分享:AI绘图学习心得-Midjourney绘画AI,让你的AI绘画之路少走弯路
干货分享:AI绘图学习心得-Midjourney绘画AI 最重要的Prompt和参数 基本 Prompts 高级Prompts 一.构图指令结构 二.常用指令分享 三.操作技巧总结 四.常用风格词汇 ...
最新文章
- Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)
- 为EditText输入框加上提示信息
- 批量移动AD用户到指定OU
- PHP usort 函数底层排序
- mercury无线路由器设置服务器无响应,有了这款路由器,从此卡顿不存在
- match VS match_phrase
- 将Matplotlib嵌入wxPython的GUI界面中
- 关于重分类工具的其他讨论
- 【工作笔记001】SuperMap配准TransCAD底图
- latex怎么改字体大小_latex更改字体 latex局部字体大小
- Can‘t open /dev/sda3 exclusively. Mounted filesystem?
- 目前建站系统用的比较多的几个系统(几款值得推荐的建站系统)
- 简述MES系统的9大核心功能模块
- 史上最强窃密软件来袭,手机或成泄密工具
- Rhythmbox乱码的解决办法
- 在VMware上安装Android虚拟机
- PG 异常状态- active+undersized+degraded
- 1.0 Linux 网络相关概念和修改IP地址的方法
- Paper Reading:Image-to-Image Translation with Conditional Adversarial Networks
- On-Premise