Java中的局部变量表及使用jclasslib进行查看

原创 2017年02月18日 23:42:28

直接上下载地址

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

http://downfile.downcc.com/down/JClassLib_windows.zip

什么是局部变量表

在《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

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

版权声明:同步发布:sixtrees.github.com https://my.oschina.net/itsyizu/blog/

java虚拟机 jvm 局部变量表实战

java局部变量表是栈帧重要组中部分之一。他主要保存函数的参数以及局部的变量信息。局部变量表中的变量作用域是当前调用的函数。函数调用结束后,随着函数栈帧的销毁。局部变量表也会随之销毁,释放空间。 由于...

JVM局部变量表

java中方法的局部变量是放在虚拟机栈的局部变量表里面:   Java代码   public static void main(String[] args) {     ...

直接修改class文件 工具:jclasslib

1、用class file editor打开要修改的class,找到要修改的行号(如果597行) 2、编写main方法来修改 package test; import java.io.Dat...

jclasslib修改class文件内容

 1.用jd-gui打开该jar或 打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity 找到对应需要修改的代码所在的方法名 我这里包含提示信息的这段代码在方法...
  • djun100
  • djun100
  • 2014年05月01日 18:37
  • 4480

如何利用JClassLib修改.class文件

最近在学习逆向分析和反编译,无意之中了解到了JClassLib。JClassLib不但是一个字节码阅读器而且还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。其他的用途我就不说...

利用jclasslib修改java编译后的.class文件

在Eclipse中新建一个test类,通过IO流来修改class中的值 [java] view plain copy   import java.io...
  • dhdhxgx
  • dhdhxgx
  • 2016年11月08日 17:40
  • 780

Jclasslib 试用

简述: jclasslib 作为一个
  • anialy
  • anialy
  • 2014年10月27日 00:33
  • 1592

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半...
  • hexin373
  • hexin373
  • 2011年08月08日 16:50
  • 103838

利用jclasslib修改java编译后的.class文件

修改class文件
  • hoho_12
  • hoho_12
  • 2016年07月18日 15:56
  • 1437

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的局部变量表及使用jclasslib进行查看
举报原因:
原因补充:

(最多只允许输入30个字)