Java final变量的生命周期和内存回收

时间:2022-06-26 04:38:38

今天工作,对java的final变量的生命周期进行了一下研究。

直接看代码:


package com.test.xiaomi.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

private A a2 = new A();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test1();
test2(a2);
}

private void test1() {
final A a = new A();
new Thread() {

@Override
public void run() {
a.a ++;
}

}.start();
}

private void test2(final A a1) {

t2 = new Thread() {
@Override
public void run() {
a1.a ++;
}
};
t2.start();
}

private static Thread t2;

private class A {
public int a =0;

}
}​

直接给结论:

test1函数中,a的内存是线程跑完被释放,而a1不会被释放,很可能造成内存泄露。


理由:

反编译进行研究后,发现匿名内部类(那两个new的thread),会将final的变量当成自己的一个成员变量保存


a还好,因为线程跑完就可以被gc。

而t2线程是static的,导致会一直有一个引用引向a1堆中的内存,不会被GC。