如何在Java中运行时停止主线程使用完整的CPU

时间:2014-11-05 11:49:03

标签: java multithreading oop cpu-usage

我将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的原理,这就是我的困惑。

1 个答案:

答案 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插件将如下所示:

enter image description here


要查看程序内存不足,请提供以下代码。它会将每个字符串实例添加到一个列表中,该列表具有从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 );
    }

}