2013-02-25 100 views
8

如果您运行下面的代码会发生什么情况..关于“新”的关键字

while (true) { 
    String x = new String("ABC"); 
} 
在内存方面

Java的内存问题吗?

字符串x分配在堆栈上还是堆上?程序最终会因内存溢出而崩溃,还是会因垃圾收集而阻止?新关键字是否始终在堆上创建对象?何时在堆栈上创建对象?

谢谢!

+1

你可能想看看http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 – 2013-02-25 09:10:07

+0

嗨,罗汉,请一次提出一个问题。 – MByD 2013-02-25 09:13:49

+0

他们是相关的问题,所以我将它们加在一起,以便我(和其他人)可以对此主题有广泛的理解! – 2013-02-25 09:15:33

回答

7

是字符串x分配在堆栈上还是堆上?

x不是String。它是对String的引用。该引用是一个局部变量,因此在栈上。 String是一个对象,因此会堆积如山。

会将程序崩溃,最终因为内存溢出

大概不会的。

还是会垃圾回收阻止?

它应该。

新的关键字是否总是在堆上创建对象?

是的。

何时在堆栈上创建对象?

永远......除非JVM决定它不能逃避当前的范围,所以决定这样做。

+0

+1尼斯的答案与解释。 :) – 2013-02-25 09:26:37

+1

不完全是我的专业领域 - 但是在这种情况下,对象不能逃避当前范围并因此导致字符串被分配到堆栈上吗? – mikera 2013-02-25 09:26:45

+0

是的,程序不会崩溃,我一直运行这个片段很长时间,但程序仍在运行。很好的答案! (+1) – asifsid88 2013-02-25 09:27:28

2

使用新的,是的,把对象放在堆上。不能被任何线程访问的对象可以被垃圾回收。无论内存是否耗尽,都取决于程序使用的数据大小,如果擅长“释放”对象,则不需要更多内存(请考虑:内存泄漏很糟糕)。

在你的例子中,你会像疯了一样运行垃圾回收器,我认为这是你打算演示的。

局部变量进入堆栈。

-1

理论上,new在堆上创建,并且在堆上创建非对象(即,int s,char s等)。唯一的例外,afaik,也是在堆栈上创建的字符串。实际上,许多现代JVM的JIT编译器将会看到,在某些情况下,可以在堆栈上创建使用new创建的对象(例如,未在当前函数外引用的本地对象)。

垃圾收集器将负责解除您的分配,这是它的目的,但是当然如果您在同一时间创建并保留对太多对象的引用,则可能会导致内存不足(尝试使用十亿字符串,例如)。

+0

堆栈中的字符串没有例外。 – EJP 2013-02-25 09:27:16