我将Simple Forever循环这样进入系统,这是我系统的MVCE示例。
public static void main(String args[]){
while (true) {
String string = new String("Hello World");
System.out.println("String " + string);
}
}
根据OOPS,将会在将要发生的所有迭代中创建新的Object。直到该内存不会被释放,那么它将耗尽堆空间错误。
然后我怎么能阻止CPU,我怎么能克服这个问题。
同样地,我也喜欢这样的文字。
public static void main(String args[]){
while (true) {
String string = "Hello World";
System.out.println("String " + string);
}
}
对于第二种情况,如果所有时间仅引用了一个在字符串常量池中创建的文字。那么它不应该是内存错误。
但我没有得到它如何防止即将发生的错误。
请我同意你的建议我已经阅读了很多关于oops的原理,这就是我的困惑。
答案 0 :(得分:5)
CPU正在最大化,因为代码在紧密循环中运行,在写入stdout时仅在IO上稍微停止。要使用较少的CPU,请通过在while循环中添加Thread.sleep(10)来略微限制循环。至于string
没有得到GC,是的,因为当while循环重新启动时,对象的引用将被删除。
一种说服自己的方法是使用Visual GC插件运行jvisualvm,您将能够在程序运行时查看堆大小。伊甸园空间会增长一点,然后会回落到零。其他几代人将保持空虚。
JVisualVM是JDK的一部分,因此您可能已经安装了它。对于Visual GC插件,单击tools->plugins->available plugins
),您应该在列表中找到它,具体取决于您的防火墙。
启动并运行JVisualVM后,Visual GC插件将如下所示:
要查看程序内存不足,请提供以下代码。它会将每个字符串实例添加到一个列表中,该列表具有从while循环外部保持的强引用。
public static void main(String args[]){
List list = new java.util.ArrayList();
while (true) {
String string = new String("Hello World");
System.out.println("String " + string);
list.add( string );
}
}