如果运行以下代码会发生什么?
while (true) {
String x = new String("ABC");
}
关于内存方面的问题?
String x 是在栈上还是堆上分配的?程序是否会因为内存溢出而崩溃,还是会被垃圾回收机制阻止?new 关键字是否总是在堆上创建对象?什么时候会在栈上创建对象?
谢谢!
while (true) {
String x = new String("ABC");
}
关于内存方面的问题?
String x 是在栈上还是堆上分配的?程序是否会因为内存溢出而崩溃,还是会被垃圾回收机制阻止?new 关键字是否总是在堆上创建对象?什么时候会在栈上创建对象?
谢谢!
字符串x是在堆栈上还是堆上分配的?
x
不是一个 String
。它是对 String
的引用。该引用是局部变量,因此放在堆栈上。而 String
是一个对象,所以放在堆上。
程序最终会因内存溢出而崩溃吗?
很可能不会。
还是垃圾回收程序会防止这种情况发生?
应该会。
new 关键字是否总是在堆上创建对象?
是的。
什么时候会在堆栈上创建一个对象?
从来没有...除非 JVM 认为它无法逃离当前作用域,因此决定这样做。
理论上,new
在堆上创建对象,而非对象(例如 int
、char
等)则在栈上创建。唯一的例外是字符串,也会在栈上创建。实际上,许多现代 JVM 的 JIT 编译器会发现,在某些情况下,使用 new
创建的对象可以在栈上创建(例如,局部对象在当前函数之外没有被引用)。
垃圾回收器将为您处理释放内存的工作,这是它的目的,但如果您同时创建并保留太多对象的引用,就可能会耗尽内存(例如,尝试创建一个包含十亿个字符串的列表)。