gpt4 book ai didi

java - 在 Java 中运行时如何阻止主线程消耗完整的 CPU

转载 作者:行者123 更新时间:2023-11-29 07:44:51 25 4
gpt4 key购买 nike

我在系统中有这样的简单永远循环,这是我系统的 MVCE 示例。

public static void main(String args[]){
while (true) {
String string = new String("Hello World");
System.out.println("String " + string);
}

}

根据 OOPS,将在所有将要发生的迭代中创建新对象。直到该内存将不可用,然后它将用完堆空间错误。

那我怎么能阻止 CPU 这样做,我又怎么能克服这个问题呢。

类似地,我有这样的文字。

public static void main(String args[]){
while (true) {
String string = "Hello World";
System.out.println("String " + string);
}

}

对于第二种情况,如果所有时间只引用一个在字符串常量池中创建的文字。那么它不应该给出内存不足错误。

但我不明白它是如何防止出现的错误的。

请给我你的建议,我已经阅读了很多 oops 的原理,这就是我的困惑。

最佳答案

CPU 已达到极限,因为代码在紧密循环中运行,在写入 stdout 时仅在 IO 上略微停顿。要使用更少的 CPU,通过在 while 循环中添加 Thread.sleep(10) 来稍微限制循环。至于 string 没有得到 GC,是的,当 while 循环重新启动时,对对象的引用将被删除。

让自己相信这一点的一种方法是运行 jvisualvm使用 Visual GC 插件,您将能够在程序运行时观察堆大小。伊甸园空间会增长一点,然后会回落到零。其他世代将保持空白。

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 );
}

}

关于java - 在 Java 中运行时如何阻止主线程消耗完整的 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26756513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com