回答
不一定。
在大多数情况下,Java 对象默认是在堆上分配的。但是,为了优化性能,JVM 引入了一种名为逃逸分析(Escape Analysis)的技术。通过逃逸分析,JVM 可以确定对象是否可以在方法中被局部使用而不逃逸到方法外部。如果一个对象只有一个方法使用,且不会逃逸处这个方法,那么 JVM 则会在栈上分配该对象,而不是在堆上。例如:
public class EscapeAnalysisTest {
public void createObject() {
Point point = new Point(1, 2);
System.out.println(point.x + ", " + point.y);
}
}
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
在这种情况下,JVM 通过逃逸分析确定 Point
对象不会逃逸出createObject()
,那么 JVM 可以将 Point
对象分配在栈上,而不是堆上。
关于逃逸分析的详细情况请阅读:有没有了解逃逸分析技术?
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括: