簡體   English   中英

在Apache服務器上運行.jar,但內存不足錯誤

[英]Running a .jar on Apache server, but out of memory error

我想在Apache服務器上運行.jar。 (我的主持人提供cPanel支持,等等。)

當我嘗試使用以下命令運行它時:

java -jar "JAR_FILE_PATH"

一段時間后,我得到了錯誤:

java.lang.OutOfMemoryError:無法創建新的本機線程

我也嘗試使用-Xmx16m - Xmx2G來運行,但是出現了同樣的錯誤。

在此處輸入圖片說明

也許有些cmd可以配置默認值,但是我還是菜鳥,這是第一次。

有人有什么主意嗎?

OutOfMemoryError: unable to create new native thread意味着您沒有足夠的本機內存來生成線程。 注意,這與堆空間完全不同。

發生該錯誤的最典型情況是耗盡堆棧空間,地址空間或max user processes 幾乎所有情況都與創建過多線程有關。

  1. 可以通過ulimit -s檢查Linux上的stack space 每個Java線程消耗一定數量的堆棧大小。 可以通過-Xss-XX:ThreadStackSize=...進行配置-XX:ThreadStackSize=...您可以通過java -XX:+PrintFlagsFinal -version | grep ThreadStackSize檢查平台的默認堆棧大小。 java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 如果您的應用程序確實需要深層堆棧,則可以通過減少ThreadStackSize來壓縮更多線程,但代價是StackOverflowError
  2. 如果您使用32位JVM,則address space是一個問題。 根據你的截圖,你正在使用32位JVM,所以你與4G總的地址空間的限制。 這包括所有東西(堆,非堆,堆棧,本機內存等)。 也就是說,分配給堆(-Xmx)的數量越多,可以創建的線程就越少。 解決方法是使用64位JVM或減小堆大小等。
  3. 可以通過ulimit -u監視Linux上的max user processes 如果您有1000個進程的“默認”限制,則可以輕松實現這一目標,因為每個線程都計入該限制AFAIK。 那里的解決方案是增加限制。

通常,您可能希望添加-XX:+HeapDumpOnOutOfMemoryError ,收集堆轉儲並檢查使用的線程數。 如果線程數是合理的(例如,少於100個),則您要檢查配置(上面的1-3)。 如果線程數太瘋狂(例如,超過100個),則可能需要查找缺陷並進行修復。

暫無
暫無

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

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