gpt4 book ai didi

java - 使用 -Xss 重现 OutOfMemoryError

转载 作者:行者123 更新时间:2023-11-29 04:14:28 28 4
gpt4 key购买 nike

我正在尝试重现 java.lang.OutOfMemoryError: unable to create new native thread但是使用 -Xss VM 参数。我猜想如果我们有大量线程,并且每个线程都占用 X 堆栈空间,那么如果 threads*X > 总堆栈大小,我将遇到异常。但什么也没发生。

我的测试员:

`public static void main(String[] args) 抛出异常{

    ThreadPoolExecutor executor = new ThreadPoolExecutor(1000, 15000, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
int i = 0;

try
{

Thread.sleep(100);
for (; i <= 10; i++)
{
Runnable t = new Runnable()
{
List<Object> objects = new LinkedList<>();

public void run()
{
while (true)
{
objects.add(new Object());
}
}
};

executor.submit(t);

}
}
catch (Throwable e)
{
System.err.println("stop with " + i + " threads, " + e);
System.err.println("task count " + executor.getTaskCount());
System.out.println("get active thread count " + executor.getActiveCount());
executor.shutdownNow();

}
}

`

我的虚拟机参数是

-Xms512m -Xmx512m -Xss1g

知道为什么我没有异常(exception)吗?我该如何拒绝它?

谢谢

最佳答案

在大多数 OSE 上,堆栈是延迟分配的,即只有您实际使用的页面才会变成实际内存。您的进程限制为每个进程 128 到 256 TB 的虚拟内存,具体取决于您使用的操作系统,因此在每个线程 1 GB 时,您至少需要 128k 个线程。我会尝试更大的堆栈。例如。 256克

编辑:我自己尝试过,它似乎忽略了 4g 及以上的堆栈大小。在 Windows 上最大的尺寸是 -Xss4000m。

试图在 Windows 上重现它,它似乎在抛出任何异常之前使机器过载。

这是我试过的。使用 -Xss4000m 运行,它达到了 20 多个线程(在我的 windows 笔记本电脑停止工作之前总共 80g)

您可能会发现在 Linux 中,它会在使机器过载之前达到 ulimit

import java.util.concurrent.*;

class A {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor pool = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<>());
try {
for (int i = 0; i < 100; i++) {
System.out.println(i);
pool.submit(() -> {
try {
System.out.println(recurse() + " size " + pool.getPoolSize());
} catch (Throwable t) {
t.printStackTrace();
}
return null;
});
Thread.sleep(1000);
}
} finally {
pool.shutdown();
}
}

static long recurse() {
try {
return 1 + recurse();
} catch (Error e) {
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
return 1;
}
}
}

关于java - 使用 -Xss 重现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250441/

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