博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的局部变量表及使用jclasslib进行查看
阅读量:5127 次
发布时间:2019-06-13

本文共 1537 字,大约阅读时间需要 5 分钟。

直接上下载地址

jclasslib是一个独立的工具,不是包含在JDK中的工具,需要自己进行下载,下载地址如下:

什么是局部变量表

在《java中的栈》中我们说到了一个栈帧至少需要包含局部变量表、操作数栈、帧数据区这三个部分。局部变量表是用于保存函数的参数以及局部变量的。顾名思义,局部变量表中的变量只在当前的函数的用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之被销毁。

由于局部变量表在栈帧之中,因此,如果函数的参数和局部变量很多,会使得局部变量表膨胀,因此,每一次函数调用,其局部变量表就会占用更多的栈空间,最终导致函数的嵌套调用的次数减少。

代码来帮忙

public class TestStackDeepth {    private static int length=0;    public static void  recursion(long a,long b,long c) {    long e=1,f=2,g=3,h=4,i=5,k=6,q=7,x=8,y=9,z=11;    length++;    recursion(a, b, c);    }    public static void main(String[] args) {    try {        recursion(1l,2l,3l);    } catch (Throwable ex) {        System.out.println(length);    }    }}

使用jclasslib

打开jclasslib,选择对应的3中.class文件

enter description here

加载好的jclasslib界面如下图所示

enter description here

在jclasslib中可以看到recursion函数的最大局部变量是26个字。因为该函数一共13个参数和局部

变量,而且都是long类型。

enter description here

查看class文件的局部变量表的内容(下图中的局部变量表是指class文件的一个属性,而不是上文中所说的

java栈中的每个栈帧的局部变量表)

enter description here

从上面可以看到,在class文件的局部变量表中,显示了每个变量的作用域范围,所在槽位的索引(index列)、变量名(name列)和数据类型列(J表示long型)。

栈中的局部变量表的槽位是可以重复利用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的新的局部变量很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。

槽位复用的例子

public class IndexReuse {
public static void method1() { int a=0; System.out.println(a); int b=0; } public static void method2() { { int a=0; System.out.println(a); } int b=0; } public static void main(String[] args) { }}

method1中的局部变量表,由于a和b的作用范围都是整个函数,所以,b不用复用a的槽位

enter description here

method2中的局部变量表,由于a只在{}中起作用,所以b在a之后,可以复用a的槽位,因此a和b的槽位都是0

从上面的例子我们可以体会到局部变量的声明位置会影响垃圾回收器对变量所占内存空间的回收,因此,在以后的程序设计中,我们应该尽可能的进行优化,从而提高性能。

转载于:https://www.cnblogs.com/shugen/p/6862982.html

你可能感兴趣的文章
HTTP之报文
查看>>
Perl正则表达式匹配
查看>>
windows下的文件管理工具--total commander
查看>>
四元数
查看>>
功率谱密度如何理解
查看>>
git clean解决 GIT error: The following untracked working tree files would be overwritten
查看>>
windows下的计算时间间隔 -- GetTickCount()
查看>>
Excel在数据表中悬停鼠标显示数据值
查看>>
UML类图知识
查看>>
香农的伟大论文《A Symbolic Analysis of Relay and Switching Circuits》
查看>>
OpenMark
查看>>
c++11 enum class用法
查看>>
excel中怎么将行转换为列及列转换成行
查看>>
git 版本(commit) 回退
查看>>
c++ 数值计算库Eigen
查看>>
CodeMeter 软件加密技术
查看>>
git 版本库之间的依赖
查看>>
python全栈开发中级班全程笔记(第三模块、第一章(多态、封装、反射、内置方法、元类、作业))...
查看>>
react-01
查看>>
sublime插件安装
查看>>