如果您频繁存取变量,就需要考虑从何处存取这些变量。变量是 static 变量,还是堆栈变量,或者是类的实例变量?变量的存储位置对存取它的代码的性能有明显的影响?例如,请考虑下面这段代码:

class StackVars

{

private int instVar;

private static int staticVar;

//存取堆栈变量

void stackAccess(int val)

{

int j=0;

for (int i=0; i

j += 1;

}

//存取类的实例变量

void instanceAccess(int val)

{

for (int i=0; i

instVar += 1;

}

//存取类的 static 变量

void staticAccess(int val)

{

for (int i=0; i

staticVar += 1;

}

}

这段代码中的每个方法都执行相同的循环,并反复相同的次数。唯一的不同是每个循环使一个不同类型的变量递增。方法 stackAccess 使一个局部堆栈变量递增,instanceAccess 使类的一个实例变量递增,而 staticAccess 使类的一个 static 变量递增。

instanceAccess 和 staticAccess 的执行时间基本相同。但是,stackAccess 要快两到三倍。存取堆栈变量如此快是因为,JVM 存取堆栈变量比它存取 static 变量或类的实例变量执行的操作少。请看一下为这三个方法生成的字节码:

Method void stackAccess(int)

0 iconst_0         //将 0 压入堆栈。

1 istore_2         //弹出 0 并将它存储在局部分变量表中索引为 2 的位置 (j)。

2 iconst_0         //压入 0。

3 istore_3         //弹出 0 并将它存储在局部变量表中索引为 3 的位置 (i)。

4 goto 13          //跳至位置 13。

7 iinc 2 1         //将存储在索引 2 处的 j 加 1。

10 iinc 3 1         //将存储在索引 3 处的 i 加 1。

13 iload_3          //压入索引 3 处的值 (i)。

java基本变量的堆栈_JAVA经验谈:尽可能使用堆栈变量相关推荐

  1. java的Deque栈_Java使用Deque实现堆栈的方法

    本文实例讲述了Java使用Deque实现堆栈的方法.分享给大家供大家参考.具体如下: import java.util.ArrayDeque; import java.util.Deque; publ ...

  2. java 堆栈_Java中线程与堆栈的关系

    栈是线程私有的,每个线程都是自己的栈,每个线程中的每个方法在执行的同时会创建一个栈帧用于存局部变量表.操作数栈.动态链接.方法返回地址等信息.每一个方法从调用到执行完毕的过程,就对应着一个栈帧在虚拟机 ...

  3. java反射 获取局部变量_Java反射:如何获取变量的名称?

    呼唤远方 如果您使用以下的调试信息进行编译:javac -g),局部变量的名称保存在.class文件中.例如,以这个简单的类为例:class TestLocalVarNames { public St ...

  4. java 全局变量 命名规则_Java 基础 运算符 命名规则 变量 循环

    1.程序: 一组指示计算机执行行动或坐车判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上. 2.软件 与计算机操作系统有关的计算机程序,规程.规则,以及可能有的文件,文档及数据 3.软 ...

  5. java 父类访问子类_java中父类访问子类变量

    我们都知道,子类的方法可以访问父类的实例变量,这是因为子类继承父类就会获得父类的成员变量和方法:但是父类的方法水能访问子类的实例变量,因为父类根本无法知道它将被哪个子类继承,它的子类将会增加怎样的成员 ...

  6. java element 获取属性_java 获取类,属性变量,方法,方法参数上注解的值等

    一:获取类上注解的值 定义注解@Target(ElementType.TYPE)用于类,接口等 @Target(ElementType.TYPE) @Retention(RetentionPolicy ...

  7. java中final语句_Java中使用非final变量的不可访问语句

    下面是一个示例,其中我们将看到使用非final变量"-的unreachable语句 示例class Demo_example { int a = 2, b = 3; void display ...

  8. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  9. java打印线程堆栈_Java问题定位之Java线程堆栈分析

    采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...

最新文章

  1. IDEA中的项目没有被SVN管理解决办法
  2. c语言p,用C语言实现P、V操作
  3. boost::mpi模块all_reduce() 集合的测试
  4. id随机选择另一张表格的 sql_表格问答1:简介
  5. php字符串怎么传到html_php字符串函数(四):html与字符串之间的转换
  6. loj#2143. 「SHOI2017」组合数问题
  7. (五)SpringBoot 能挣钱的几个项目!!!
  8. linux 跟踪内存,用strace跟踪malloc内存分配
  9. Windows 10 怎样管理已连接过的无线网?
  10. 类的自动转换和强制类型转换
  11. javascript 实现页面加载完再显示页面
  12. SSM框架整合-404
  13. python打印图像所有的像素值
  14. 10_微信小程序-BLE低功耗蓝牙开发-连接设备
  15. php里用钢笔画曲线,ps钢笔工具怎么画图
  16. SV-- event(二)
  17. [Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理
  18. scala sortBy and sortWith
  19. Chromium WebView
  20. android sim 卡7816,采用SO7816标准规范的SIM卡读卡器的研究

热门文章

  1. python如何爬取图片到指定文件夹论文_基于Python的图片爬虫程序设计
  2. matlab 解相位_光测力学栅线投影技术-相位求解方法
  3. 如何添加评论_如何运用运镜+转场让视频更酷炫
  4. 最新Discuz验证码和PhpWind验证码的识别
  5. python查找多个关键词,在字符串列表中搜索多个关键字
  6. html css . doc,html+CSS基础.doc
  7. vue+element-ui 实现table单元格点击编辑,并且按上下左右键单元格之间切换
  8. svn服务器搭建之备份3
  9. ArchSummit微课堂|蘑菇街DevOps实践及心路历程分享
  10. android内核中Kconfig及如何加自己的驱动