Java中的局部变量表及使用jclasslib进行查看
直接上下载地址
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文件

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

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

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

从上面可以看到,在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的槽位

method2中的局部变量表,由于a只在{}中起作用,所以b在a之后,可以复用a的槽位,因此a和b的槽位都是0
从上面的例子我们可以体会到局部变量的声明位置会影响垃圾回收器对变量所占内存空间的回收,因此,在以后的程序设计中,我们应该尽可能的进行优化,从而提高性能。
Java中的局部变量表及使用jclasslib进行查看的更多相关文章
- java虚拟机 jvm 局部变量表实战
java局部变量表是栈帧重要组中部分之一.他主要保存函数的参数以及局部的变量信息.局部变量表中的变量作用域是当前调用的函数.函数调用结束后,随着函数栈帧的销毁.局部变量表也会随之销毁,释放空间. 由于 ...
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- JAVA中正則表達式总结
昨天,我的朋友请教我正則表達式.我也好久没有写过正則表達式了,昨天刚好看了下如鹏网创始人杨中科老师关于正則表達式的解说.使我加深了正則表達式的印像.现我把他总结下: 很多语言,包含Perl.PHP.P ...
- JAVA迭代器学习--在JAVA中实现线性表的迭代器
1,迭代器是能够对数据结构如集合(ADT的实现)进行遍历的对象.在遍历过程中,可以查看.修改.添加以及删除元素,这是它与一般的采用循环来遍历集合中的元素不同的地方.因为,通常用循环进行的遍历操作一般是 ...
- JAVA中正則表達式总结(具体解释及用途)
很多语言,包含Perl.PHP.Python.JavaScript和JScript,都支持用正則表達式处理文本,一些文本编辑器用正則表達式实现高级"搜索-替换"功能.所以JAVA语 ...
- Java中的局部变量、成员变量和静态变量
直接看代码 public class Variable { // 静态变量,属于类的变量,且用关键字static声明,不属于实例,虽然可以通过实例来调用,但是不建议 private static in ...
- Java中的多表&事务&DCL&一个多表操作例子
准备sql: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO d ...
- Java中,当表单含有文件上传时,提交数据的如何读取
http://blog.csdn.net/lian_zhihui1984/article/details/6822201
- 从 i++ 和 ++i 说起局部变量表和操作数栈
本文转载自:从 i++ 和 ++i 说起局部变量表和操作数栈 最近公司有人看了尚硅谷柴林燕老师的第一季面试题,就想来考考我.我觉得柴老师讲的很好,部分内容可以延伸一下,所以写这篇文章分享给大家! 这篇 ...
随机推荐
- sass.scss简单入门
最近研究了一下sass和scss,清晰结构化,在某些地方的确强大,所以写了一篇入门教程,大概15分钟左右就能明白基本原理 什么是sass(css预处理器) Sass官网上是这样描述sass的,sass ...
- 推荐virtualBox虚拟机及安装使用的注意事项
推荐选择virtualBox虚拟机 选择vbox是因为,本人觉得使用起来比VMware要方便. 简要说明: 本人自学前端开发,对于linux了解很少,直接上手真实的linux环境会很不适应,所以选择了 ...
- 整合初步--------->SSH(注解版)
上面的一篇博客已经介绍了 Spring和Hibernate之间的整合,没看过的童鞋可以去看看,这篇博客讲解Spring+Hibernate+Struts2注解版......... 个人觉得使用注解可能 ...
- Xamarin+Prism开发之.net standard化
前面[Visual Studio 2017创建.net standard类库编译出错原因]已经解决.net standard类库的编译问题,现在可以正式进入主题了.作为.net 跨平台开发者也得跟上时 ...
- “this kernel requires an x86-64 CPU, but only detects an i686 CPU, unable to boot” 问题解决
1. 问题描述: 在Virtual Box上安装 Ubuntu 系统时出现错误(如题),VIrtual Box 上也没有64位操作系统的选项 2.原因分析: (1) 可能 BIOS 的 Virtua ...
- AM335X开发板学习系列——环境搭建(vbox虚拟机ubuntu14.04下minicom的安装和配置)
这个系列是我学习AM335X的总结. 1. ubuntu虚拟机的USB设备,选择启用usbserial 2. ubuntu虚拟机的网络,采用桥接模式,以保证开发板和ubuntu虚拟机能互相ping通 ...
- Twitter数据抓取的方法(二)
Scraping Tweets Directly from Twitters Search Page – Part 2 Published January 11, 2015 In the previo ...
- .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行
本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...
- .Net MVC4笔记之js css引用与压缩
1.引用时,可以用即可以直接使用“~”来表示根目录. 引入js 引入js 引入css <link href="~/Content/uploadify/uploadify.css&quo ...
- EasyUI之Hello world(EasyUI的入门学习)
1:创建一个动态web工程: 去官网http://www.jeasyui.net/download/下载官网文档 我去官网下载的最新版本,个人根据自己的需求下载即可.2:在webConte ...