簡體   English   中英

Ubuntu 無法啟動另一個 Java 線程

[英]Ubuntu can´t start another Java thread

我的問題是,我在啟動 41 個線程的 ubuntu linux 服務器上有一個可執行文件 jar。 現在我想啟動第二個 jar 文件,它創建了類似數量的線程,但它不起作用。 我收到錯誤:

java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

即使當我嘗試輸入 java -version 時,我也會收到此錯誤。 我查看了我的 memory 限制,它只使用了 10% 的內核和 2 個 8GB 內存。

當我輸入 ulimit -a 我得到每個用戶 62987 個進程

當我查看 /proc/sys/kernel/pid_max 時,我得到了 32768。

我不知道我應該做什么有人可以幫助我嗎?

我的問題是,我在啟動 41 個線程的 ubuntu linux 服務器上有一個可執行的 jar 文件。 現在我想啟動第二個 jar 文件,該文件創建了類似數量的線程,但它不起作用。 我得到錯誤:

java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

即使我嘗試輸入 java -version 我也會收到此錯誤。 我查看了我的 memory 限制,它只使用 10% 的內核和 2 個 8GB 內存。

當我輸入 ulimit -a 時,每個用戶有 62987 個進程

當我查看 /proc/sys/kernel/pid_max 時,我得到了 32768。

我不知道我該怎么做有人可以幫助我嗎?

您的問題中沒有足夠的細節來給出明確的答案或解決方案。


問題幾乎可以肯定不是操作系統對線程數施加的限制。 它很可能與 memory 相關。

你說 8GB RAM 中有 2GB 正在使用,但你沒有說你是如何得到這個數字的。 有許多不同的方法可以衡量 memory 的使用情況,它們的含義也不同。

當一個 JVM 啟動一個新線程時,它會去操作系統並請求一個 memory 的塊來保存線程堆棧。 默認線程堆棧大小是特定於平台的,但通常為 1GB。 這可以通過 JVM 命令行選項進行修改,或者由應用程序使用具有堆棧大小參數的Thread構造函數進行修改。 請注意,堆棧段未分配在 Java 堆中。


所以這里有一些可能的解釋。

一種可能是您正在運行 32 位 JVM。在 Linux 平台上,這會將您限制為 4GB 地址空間,而架構問題會將 JVM 限制為小於實際可用空間。 如果達到此限制,操作系統將拒絕 JVM 對堆棧段的請求。 (檢查您是否安裝了 64 位 Jave,並且沒有提供-d32命令行選項。)

第二種可能性是您沒有足夠的交換空間。 如果操作系統有足夠的物理 RAM交換空間(頁面文件空間)來容納該段,則它只會分配一個 memory 段。 如果它發現沒有足夠的空間來容納當前正在運行的所有應用程序的所有頁面,它將拒絕 JVM 對堆棧段的請求。

第三種可能性是您已經為 JVM 配置了一個非常大的堆,並且在系統級別保留了所有可用的虛擬 memory。

第四種可能性是您不小心使用-Xss配置了非默認堆棧大小。

最后一種可能性是您實際運行的線程數超過您認為的 41 個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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