gpt4 book ai didi

java - 强制java内存不足..不一致的java行为

转载 作者:行者123 更新时间:2023-12-02 10:51:29 25 4
gpt4 key购买 nike

我故意创建了以下类来导致内存不足错误

public class Test1
{
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer();
while(true)
{
Test1 a = new Test1();
sb.append(a.toString());
}
}
}

正如我所料,上面的类(class)失败了,我想要的......

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at Test1.main(Test1.java:10)

但是这个:

public class Test1
{
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer();
while(true)
{
Test1 a = new Test1();
System.out.println(sb.toString());
sb.append(a.toString());
}
}
}

不会崩溃。通过在控制台上一遍又一遍地打印对象地址,运行得很好。

我的问题是:

简单的 SOP 有何不同?

最佳答案

您关于不存在 OutOfMemoryError 的假设可能是不正确的。它只是被严重延迟了。在输出流上打印越来越大的字符串需要很长时间,以至于您的循环可能需要一个小时才能耗尽内存。

您可以通过仅每 10 次、100 次、1000 次打印来仔细检查这一点。您会发现生成的 IO 越少,错误发生得越早。也许您会在 jconsole 中看到这样的曲线:

enter image description here

正如您所看到的,堆正在缓慢但稳定地上升。即使我尝试强制垃圾回收(15:02 和 15:07),我也无法再释放所有内存。但由于我仍然只占堆的 5%,所以我现在将停止运行您的代码:-)

关于java - 强制java内存不足..不一致的java行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7319218/

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