![](/img/trans.png)
[英]Problems running Java Remote Debugger JDWP on iMac running Mac OS X Snow Leopard 10.6.7
[英]Can't get past 2542 Threads in Java on 4GB iMac OSX 10.6.3 Snow Leopard (32bit)
我正在運行以下程序,試圖找出如何配置我的JVM以獲得我的機器可以支持的最大線程數。 對於那些可能不知道的人,Snow Leopard附帶Java 6。
我嘗試使用默認值啟動它,以及以下命令行,無論JVM選項設置為什么,我總是在線程2542處獲得內存不足錯誤。
java TestThreadStackSizes 100000
java -Xss1024 TestThreadStackSizes 100000
java -Xmx128m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xss1024 TestThreadStackSizes 100000
java -Xmx2048m -Xms2048m -Xss1024 TestThreadStackSizes 100000
無論我通過什么,我得到相同的結果,在2542年內存不足錯誤
public class TestThreadStackSizes
{
public static void main(final String[] args)
{
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(final Thread t, final Throwable e)
{
System.err.println(e.getMessage());
System.exit(1);
}
});
int numThreads = 1000;
if (args.length == 1)
{
numThreads = Integer.parseInt(args[0]);
}
for (int i = 0; i < numThreads; i++)
{
try
{
Thread t = new Thread(new SleeperThread(i));
t.start();
}
catch (final OutOfMemoryError e)
{
throw new RuntimeException(String.format("Out of Memory Error on Thread %d", i), e);
}
}
}
private static class SleeperThread implements Runnable
{
private final int i;
private SleeperThread(final int i)
{
this.i = i;
}
public void run()
{
try
{
System.out.format("Thread %d about to sleep\n", this.i);
Thread.sleep(1000 * 60 * 60);
}
catch (final InterruptedException e)
{
throw new RuntimeException(e);
}
}
}
}
關於如何影響這些結果的任何想法?
我編寫了這個程序來弄清楚Windows Server 2003能夠做什么,因為我得到這些out of memory can't create native threads
非常低數量的out of memory can't create native threads
,比如幾百個。 我需要看看特定的盒子能用不同的-Xss
參數,然后我在OSX上遇到這個任意限制。
我關閉了所有程序,除了我正在運行測試的一個終端窗口,我到了2545
,這告訴我這是一個任意限制。
要獲得OSX 10.6.3的線程數,您需要:
> sysctl kern.num_threads
kern.num_threads: 2560
和
> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560
2560
號碼與2542
和2545
匹配,因為顯然有其他線程在后台運行。 根據官方文檔,無法在桌面版OSX中調整kern.num_taskthreads
。
根據Apple Developer doc ,線程堆棧大小應該至少為64K,因此忽略-Xss 1014。 但即使每個線程64K,線程堆棧內存消耗也只有160MB左右,所以這應該不是問題。 線程也可以從更有限的池中消耗內存,或者可以簡單地限制每個進程或用戶可以擁有的線程數。
您需要找出操作系統在系統上支持的最大線程數。
在linux上,您可以執行以下操作:
cat /proc/sys/kernel/threads-max
獲得最大值,並設置它你可以做類似的事情:
echo 10000 > /proc/sys/kernel/threads-max
也嘗試運行:
-XX:-UseBoundThreads
並報告結果。
你認為你將同時擁有這么多線程長達1小時嗎? 我不這么認為。 我曾在應用程序中工作,處理過數百個文檔,將它們轉換為差異。 格式,在DB中生成適當的日志並存儲特定信息。 然后它也在幾秒鍾內完成。
你應該注意的事情,明智地編碼以避免產生過多的線程。 而是使用Java提供的ThreadPool
,以便在需要時可以使用相同的線程。 這將提供更好的性能。 還要在最小的塊上保持同步,以避免執行中的瓶頸。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.