簡體   English   中英

在4GB iMac OSX 10.6.3 Snow Leopard(32位)上無法通過Java獲取2542個Threads

[英]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上遇到這個任意限制。

2542似乎是一個任意數字:

我關閉了所有程序,除了我正在運行測試的一個終端窗口,我到了2545 ,這告訴我這是一個任意限制。

要獲得OSX 10.6.3的線程數,您需要:

> sysctl kern.num_threads
kern.num_threads: 2560

> sysctl kern.num_taskthreads
kern.num_taskthreads: 2560

2560號碼與25422545匹配,因為顯然有其他線程在后台運行。 根據官方文檔,無法在桌面版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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM