如果您运行以下代码会发生什么......
while (true) {
String x = new String("ABC");
}
在记忆方面?
字符串x是在堆栈上还是在堆上分配的?由于内存溢出,程序最终会崩溃,还是垃圾收集会阻止它? new关键字是否始终在堆上创建对象?何时在堆栈上创建对象?
谢谢!
答案 0 :(得分:7)
字符串x是在堆栈上还是在堆上分配的?
x
不是String
。它是对String
的引用。引用是一个局部变量,因此在堆栈上。 String
是一个对象,因此在堆上。
程序最终是否因内存溢出而崩溃
可能不是。
或垃圾收集会阻止吗?
应该。
new关键字是否始终在堆上创建对象?
是
什么时候在堆栈上创建对象?
从不......除非JVM决定它无法逃避当前范围,因此决定这样做。
答案 1 :(得分:2)
使用new,yes,将对象放在堆上。任何线程都无法访问的对象可以被垃圾回收。是否内存不足取决于程序使用的数据大小,如果你擅长“释放”对象,你就不再需要了(想想:内存泄漏很糟糕)。
在您的示例中,您将像疯了一样运行垃圾收集器,我认为这是您打算演示的内容。
局部变量在堆栈上。
答案 2 :(得分:-1)
理论上,new
在堆上创建,并且在堆栈上创建非对象(即int
s,char
等等)。唯一的例外是afaik,也是在堆栈上创建的字符串。在实践中,许多现代JVM的JIT编译器将看到,在某些情况下,可以在堆栈上创建使用new
创建的对象(例如,未在当前函数之外引用的本地对象)。 / p>
垃圾收集器将为您处理释放,这是它的目的,但是如果您同时创建并保留对太多对象的引用,则当然可能会耗尽内存(尝试创建一个包含十亿个列表的列表)例如,字符串。