Kri*_*hna 1 java oop multithreading cpu-usage
我有这样的Simple Forever Loop进入系统这是我系统的MVCE示例.
public static void main(String args[]){
while (true) {
String string = new String("Hello World");
System.out.println("String " + string);
}
}
Run Code Online (Sandbox Code Playgroud)
根据OOPS,将会在将要发生的所有迭代中创建新的Object.直到该内存不会被释放,那么它将耗尽堆空间错误.
那我怎么能阻止CPU,我怎么能克服这个问题.
同样地,我也喜欢这样的文字.
public static void main(String args[]){
while (true) {
String string = "Hello World";
System.out.println("String " + string);
}
}
Run Code Online (Sandbox Code Playgroud)
对于第二种情况,如果所有时间只引用了一个在字符串常量池中创建的文字.那么它不应该是内存错误.
但我没有得到它如何防止即将到来的错误.
请我同意你的建议我已经阅读了很多oops的主要内容,这就是我的困惑.
CPU正在最大化,因为代码在紧密循环中运行,在写入stdout时仅在IO上稍微停止.要使用较少的CPU,请通过在while循环中添加Thread.sleep(10)来略微限制循环.至于string没有得到GC'd,是的,因为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 );
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |