`
xiaomogui
  • 浏览: 239256 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java基础之int类型字节码初识

阅读更多

在网上看到类似的一个帖子,稍微总结学习一下。字节码详解

 

package com.test;

public class Test1 {

	public void test1() {
		int a = 1;
		int b = 2;
		int c = -1;
		int d = -2;

	}

	public void test2() {
		int a = 5;
		int b = 6;
		int c = -5;
		int d = -6;
	}

	public void test3() {
		int a = 32767;
		int b = 32768;
		int c = -32768;
		int d = -32769;
	}
	
	public void test4() {
		int a = 65535;
		int b = 65536;
		int c = 65536;
		int d = -65535;
		int e = 65536;
	}

}

 

 

Compiled from "Test1.java"
public class com.test.Test1 extends java.lang.Object{
public com.test.Test1();
  Code:
   0: aload_0
   1: invokespecial #8; //Method java/lang/Object."<init>":()V
   4: return

public void test1();
  Code:
   0: iconst_1
   1: istore_1
   2: iconst_2
   3: istore_2
   4: iconst_m1
   5: istore_3
   6: bipush -2
   8: istore 4
   10: return

public void test2();
  Code:
   0: iconst_5
   1: istore_1
   2: bipush 6
   4: istore_2
   5: bipush -5
   7: istore_3
   8: bipush -6
   10: istore 4
   12: return

public void test3();
  Code:
   0: sipush 32767
   3: istore_1
   4: ldc #22; //int 32768
   6: istore_2
   7: sipush -32768
   10: istore_3
   11: ldc #23; //int -32769
   13: istore 4
   15: return

public void test4();
  Code:
   0: ldc #25; //int 65535
   2: istore_1
   3: ldc #26; //int 65536
   5: istore_2
   6: ldc #26; //int 65536
   8: istore_3
   9: ldc #27; //int -65535
   11: istore 4
   13: ldc #26; //int 65536
   15: istore 5
   17: return

}

 
public void test1();
  Code:
   0: iconst_1
   // 操作数栈 压入1
   1: istore_1
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
   2: iconst_2
   // 操作数栈 压入2
   3: istore_2
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第二个数组中
   4: iconst_m1
   //  将int型-1 压入至栈顶
   5: istore_3
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第三个数组中
   6: bipush -2
   //  将int型-2 压入至栈顶
   8: istore 4
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第三个数组中
   10: return
   // 方法执行完成 ,返回
a,b,c和d是直接从指令获取数值,而没有进行栈中交换或进入常量池。

 

public void test2();
  Code:
   0: iconst_5
   //  将int型5 压入至栈顶
   1: istore_1
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
   2: bipush 6
   // 将单字节的常量值(-128~127)6压入至栈顶,直接给变量。
   4: istore_2
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第二个数组中
   5: bipush -5
   7: istore_3
   8: bipush -6
   10: istore 4
   12: return
JAVA虚拟机对常用常量(比如0,1,2,3,4,5)的操作直接定义成了指令,而不是传统的操作指令后带操作数。 目的是减少指令长度。没有iconst_6的指令! 而是bipush 6,就是传统的指令+操作数。
a,b,c和d是直接直接给变量

 

public void test3();
  Code:
   0: sipush 32767
   //  将一个短整型常量值(-32768~32767)压入到栈顶,32767占用两个字节,sipush命令栈用
   //  一个字节,所有istore_1从3开始。

   3: istore_1
   // 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
   4: ldc #22; //int 32768
   // 从常量池中找到数组索引为22的数据,并把该值压入到栈顶栈中
   6: istore_2
   7: sipush -32768
   10: istore_3
   11: ldc #23; //int -32769
   13: istore 4
   15: return

 

public void test4();
  Code:
   0: ldc #25; //int 65535
   2: istore_1
   3: ldc #26; //int 65536
   // 从常量池中找到数组索引为26的数据,并把该值压入到栈顶栈中
   5: istore_2
   6: ldc #26; //int 65536
   // 从常量池中找到数组索引为26的数据,并把该值压入到栈顶栈中
   8: istore_3
   9: ldc #27; //int -65535
   11: istore 4
   13: ldc #26; //int 65536
   15: istore 5
   17: return

}


对于65536,大于两个字节的,编译的时候把它放入常量池部分,而把取这个数的指令写为#26,所以说
#26是线程内部可以共享的。
好处是减少了指令代码的长度.这个值可以被多次使用。


所以对于int类型的数据,0-5 直接从指令中得到;-32768~32767 直接给变量;其它的数据放到常量池中,
该范围的数据在线程内部是可共享的。


字节码详解

 

分享到:
评论

相关推荐

    单片机开发资源:基于51单片机的开发程序

    单片机开发资源,基于51单片机的开发程序,供学习参考。

    node-v9.4.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于固件库新建工程模板工程源码

    【工程源码】

    node-v9.1.0-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.9.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030中国板端光伏连接器市场现状研究分析与发展前景预测报告.docx

    2024-2030中国板端光伏连接器市场现状研究分析与发展前景预测报告

    基于QT+C++实现的随机图形验证码,带有一些可人的交互与动画+源码

    用法链接:https://menghui666.blog.csdn.net/article/details/138544047?spm=1001.2014.3001.5502 基于QT+C++实现的随机图形验证码,带有一些可人的交互与动画+源码 基于QT+C++实现的随机图形验证码,带有一些可人的交互与动画+源码 基于QT+C++实现的随机图形验证码,带有一些可人的交互与动画+源码 该项目实现了可交互的动画验证码控件,趣味性十足: 字符变换动画 噪音动画 可拖动交互

    操作系统实验-基于uCore OS内含源码以及说明书可以自己运行复现.zip

    操作系统实验-基于uCore OS内含源码以及说明书可以自己运行复现.zip

    2024-2030中国半导体零件清洗机市场现状研究分析与发展前景预测报告.docx

    2024-2030中国半导体零件清洗机市场现状研究分析与发展前景预测报告

    python教程-04-获取和设置标签内容(innerHTML).ev4.rar

    python教程-04-获取和设置标签内容(innerHTML).ev4.rar

    Qt数据可视化多种实现

    s 气泡图 s 面积图 s 雷达图 s 玫瑰图 s 3D图表

    windows10开始菜单磁贴背景是灰色的

    去白底图标

    001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮

    001 定期同步mysql数据到es 删除数据库记录同时删除es记录 es全文搜索分词和高亮

    汉字点阵滚动指示牌源程序.rar

    单片机学习代码资料

    node-v9.6.1-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2022级高等数学A2期中试题B.doc

    2022级高等数学A2期中试题B.doc

    新手指南之玩转实验楼内含源码以及说明书可以自己运行复现.zip

    新手指南之玩转实验楼内含源码以及说明书可以自己运行复现.zip

    基于qt图书馆里系统框架 qt + c/c++ + csv

    基于qt图书馆里系统 框架 qt + c/c++ + csv 角色介绍 普通用户密码 qqq 123456 模块介绍 登录 主界面 子模块图书信息 (CSV数据集加载) 子模块用户信息 (CSV数据集加载) 子模块搜索模块 子模块借阅书籍 子模块归还图书 子模块查看详情 操作 子模块快速读取(自动后台加载指定的图书csv,用户csv) 子模块快速保存(自动后台保存指定的图书csv,用户cs) 子模块文件读取(两次导入,第一次选择要导入图书csv,第二次请选择需要导入的用户csv) 子模块文件导出(两次导出,第一次选择要导入图书csv,第二次请选择需要导入的用户csv) 其他 子模块个人信息 子模块退出系统 数据集设计 使用的数据集是csv

Global site tag (gtag.js) - Google Analytics