class文件结构[5] 局部变量表的槽位复用及其对垃圾回收的影响
来源:互联网 发布:windows启动管理器 编辑:程序博客网 时间:2024/05/03 09:23
long、double类型在局部变量表中需要占用2个槽位
其他类型如int、引用类型需要占用1个槽位
非static的成员方法的第一个局部变量都是this引用
以上一节的例子为例
一共占用5个槽位,其中
D(double)类型的arg1占用2槽位,其余各占用1个槽位。
局部变量表中的槽位是可以复用的
如果一个局部变量过了其作用范围,那么在其作用范围后申明的新的局部变量,就有可能复用过期的局部变量的槽位,从而达到节省资源的目的。
以如下代码为例
Java Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.test.a;
public class Test{
public void method1(){
int a=0;
System.out.println(a);
int b=0;
}
public void method2(){
{
int a=0;
System.out.println(a);
}
int b=0;
}
public void method3(){
for(int a=0; a<100; a++){
int b=a;
System.out.println(b);
}
int c=0;
int d=0;
}
}
method1()的局部变量表占用3个槽位,其中this占用1个,a、b各占用一个
method2的局部变量表占用2个槽位,虽然也拥有this、a、b 3个局部变量,但是b复用了a的槽位,他们都占用的第1个槽位
同理,method3的局部变量表占用3个槽位,c、d分别复用了循环语句中的a、b的槽位
在执行阶段,.class文件中的局部变量表会被使用到栈帧的局部变量表中
后面会讲到,被栈帧的局部变量表直接或间接引用到的对象,在垃圾回收时是不会被回收的
槽位复用也会影响到垃圾回收,以如下代码为例,运行时使用-XX:+PrintGC参数
Java Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.test.b;
public class Test{
public void method1(){
byte[] a=new byte[5*1024*1024];
a=null;
System.gc();
}
public void method2(){
{
byte[] a=new byte[5*1024*1024];
System.out.println(a.length);
}
System.gc();
}
public void method3(){
{
byte[] a=new byte[5*1024*1024];
System.out.println(a.length);
}
int b=0;
System.gc();
}
}
在method1()中,在垃圾回收前先将a置null,使byte数组失去被引用,故可以顺利回收byte数组
在method2()中,虽然a已经离开了作用范围,但是a仍然存在于栈帧的局部变量表中,并且引用byte数组,故byte数组还不能被回收
在method3()中,局部变量b会复用a的槽位
在垃圾回收前,申明了变量b来复用a的槽位,此时栈帧的局部变量表中没有引用byte数组,故能够顺利回收byte数组
- class文件结构[5] 局部变量表的槽位复用及其对垃圾回收的影响
- JAVA局部变量对垃圾回收的影响
- finalize()方法对垃圾回收的影响
- finalize()方法对垃圾回收的影响
- 局部变量表与JAVA内存回收
- java垃圾回收器GC对性能吞吐量的影响
- 栈帧结构之局部变量表
- 局部变量表影响GC之实例解析
- JVM局部变量表
- 谈谈 局部变量表
- 栈帧-局部变量表
- 对垃圾回收的感想
- .Net学习难点讨论系列10 - 匿名方法,Lambda表达式及其对局部变量的影响
- static局部变量对性能的影响
- 32,static对局部变量的影响
- Looper对Activity对象的回收影响
- Java虚拟机中栈,栈帧,局部变量表的概念和特征。
- 关于定义class时前面加不加所在的标签,及其对优先级的影响
- 开机广告页面2017流行样式 dialogTheme的dialog版本
- STM32控制APM飞控(一)研究目的及思路
- 生成箭头
- 2D贪吃蛇游戏教程
- 使用junit测试springMVC项目提示ServletContext找不到定义错误
- class文件结构[5] 局部变量表的槽位复用及其对垃圾回收的影响
- UE4 坐标系坐标轴旋转轴
- Linux动态库文件搜索路径
- 无监督学习之K-means算法
- Chrome安全政策收紧,同时提升网站权重与排名
- new Handler()和new Handler(Looper.getMainLooper())的使用区别
- Go学习笔记(四)
- 一款极度偷懒的假分页js代码(只适用于要求很低的页面)
- MySQL函数一览_MySQL函数全部汇总