如果您运行下面的代码会发生什么情况..关于“新”的关键字
while (true) {
String x = new String("ABC");
}
在内存方面
Java的内存问题吗?
字符串x分配在堆栈上还是堆上?程序最终会因内存溢出而崩溃,还是会因垃圾收集而阻止?新关键字是否始终在堆上创建对象?何时在堆栈上创建对象?
谢谢!
如果您运行下面的代码会发生什么情况..关于“新”的关键字
while (true) {
String x = new String("ABC");
}
在内存方面
Java的内存问题吗?
字符串x分配在堆栈上还是堆上?程序最终会因内存溢出而崩溃,还是会因垃圾收集而阻止?新关键字是否始终在堆上创建对象?何时在堆栈上创建对象?
谢谢!
是字符串x分配在堆栈上还是堆上?
x
不是String
。它是对String
的引用。该引用是一个局部变量,因此在栈上。 String
是一个对象,因此会堆积如山。
会将程序崩溃,最终因为内存溢出
大概不会的。
还是会垃圾回收阻止?
它应该。
新的关键字是否总是在堆上创建对象?
是的。
何时在堆栈上创建对象?
永远......除非JVM决定它不能逃避当前的范围,所以决定这样做。
使用新的,是的,把对象放在堆上。不能被任何线程访问的对象可以被垃圾回收。无论内存是否耗尽,都取决于程序使用的数据大小,如果擅长“释放”对象,则不需要更多内存(请考虑:内存泄漏很糟糕)。
在你的例子中,你会像疯了一样运行垃圾回收器,我认为这是你打算演示的。
局部变量进入堆栈。
理论上,new
在堆上创建,并且在堆上创建非对象(即,int
s,char
s等)。唯一的例外,afaik,也是在堆栈上创建的字符串。实际上,许多现代JVM的JIT编译器将会看到,在某些情况下,可以在堆栈上创建使用new
创建的对象(例如,未在当前函数外引用的本地对象)。
垃圾收集器将负责解除您的分配,这是它的目的,但是当然如果您在同一时间创建并保留对太多对象的引用,则可能会导致内存不足(尝试使用十亿字符串,例如)。
堆栈中的字符串没有例外。 – EJP 2013-02-25 09:27:16
你可能想看看http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 – 2013-02-25 09:10:07
嗨,罗汉,请一次提出一个问题。 – MByD 2013-02-25 09:13:49
他们是相关的问题,所以我将它们加在一起,以便我(和其他人)可以对此主题有广泛的理解! – 2013-02-25 09:15:33