“栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 ”
可见,垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap!
内存逃逸技术:
不在Heap Area分配对象,不需要GC来释放对象。
主要是在Stack中来分配,Stack中回收。
对象定义在方法体内部,又被外部引用使用,则为内存逃逸。
示例:
public class Test {
public static void main() {
Work worker = new Worker()
while (true) {
worker.useWorker();
}
}
}
class Worker {
public Worker worker;
public Worker getWorker() {
return null == worker?new Worker() : worker; //对象定义在方法体内部。
}
public void setWorker() {
worker = new Worker();
}
public void useWorker() {
Worker obj = getWorker();
}
public void useWorker2() {
Worker obj = getWorker(); //没有被外部使用,不为内存逃逸
}
}