关于JAVA线程栈的局部变量有关问题
关于JAVA线程栈的局部变量问题
假设有如下方法
public void test(){
String a = new String("a");
}
那此时变量a应该是属于运行方法的线程栈内的吧?
而创建的字符串a是否存在于java堆中?
如果不是
如何理解线程栈的局部变量包括哪些
------解决方案--------------------
a是一个引用, 这个引用存在栈中, 栈是线程私有的, 这里不存在引用泄露(也就是其它线程无法获取这个引用a),
所以a可以称为当前线程的局部变量,虽然new String(); 产生的对象放在推重, 但因为无法获取指向它的引用a, 也就无法访问它。
------解决方案--------------------
1、a在方法体内声明,是局部变量,方法结束生命周期就结束,另外a是个引用变量,指向new String("a")这个对象
2、new String("a")这个对象在堆中,当a这个引用变量的生命周期结束,也就是说没有变量指向它了,那它就会变成垃圾等待GC来回收它
假设有如下方法
public void test(){
String a = new String("a");
}
那此时变量a应该是属于运行方法的线程栈内的吧?
而创建的字符串a是否存在于java堆中?
如果不是
如何理解线程栈的局部变量包括哪些
------解决方案--------------------
a是一个引用, 这个引用存在栈中, 栈是线程私有的, 这里不存在引用泄露(也就是其它线程无法获取这个引用a),
所以a可以称为当前线程的局部变量,虽然new String(); 产生的对象放在推重, 但因为无法获取指向它的引用a, 也就无法访问它。
------解决方案--------------------
1、a在方法体内声明,是局部变量,方法结束生命周期就结束,另外a是个引用变量,指向new String("a")这个对象
2、new String("a")这个对象在堆中,当a这个引用变量的生命周期结束,也就是说没有变量指向它了,那它就会变成垃圾等待GC来回收它