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

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的主要内容,这就是我的困惑.

Chr*_*s K 5

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)