关于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来回收它