【Android面试八股文】Java对象会不会分配到栈中?
文章目录
Java对象会不会分配到栈中?
一、什么是堆(Heap)
,什么是栈(Stack)
?
在Java中,对象的内存分配主要发生在堆(Heap)
中,而非栈(Stack)
。
- 堆内存:几乎所有的对象实例(包括数组实例)都分配在堆内存中。堆是共享的内存区域,可以被所有线程访问。
- 栈内存:栈内存存放局部变量和方法调用的栈帧(栈帧包含方法的局部变量表、操作数栈、动态链接和方法返回地址等)。每个线程都有自己的栈,不与其他线程共享。
二、栈上分配的特殊情况:逃逸分析
尽管Java对象
通常分配在堆
上,但有些情况下,编译器和JVM
可以进行优化
,使得对象在栈
上分配。这种优化称为逃逸分析(Escape Analysis)
。
逃逸分析
逃逸分析
指的是分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用。
- 方法逃逸
比如:调用参数传递到其他方法中,这种称之为方法逃逸
。 - 线程逃逸