Tomcat
Solaris 10 上 Tomcat 的記憶體問題
我有一台執行 Solaris 10 的伺服器。它報告了 70+ GiB 的可用 RAM。我正在嘗試在 64 位模式下使用 Java 1.7.0_80 啟動 Tomcat 7.0.68。
伺服器聲稱它無法分配 717 MiB 的 RAM。每次嘗試時,我都會得到一個 hs_err_pidxxx.log 文件。它暗示了這一點:
# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 717225984 bytes for committing reserved memory. # Possible reasons: # The system is out of physical RAM or swap space
沒有。有 70 GiB 可用,它正在嘗試分配 700ish MiB。
# In 32 bit mode, the process size limit was hit
我們處於 64 位模式。
# Possible solutions: # Reduce memory load on the system
除了作業系統,這台機器上沒有別的東西。
# Increase physical memory or swap space
我們已經比需要的多兩個數量級。
# Check if swap backing store is full
不。
# Use 64 bit Java on a 64 bit OS
完畢。
# Decrease Java heap size (-Xmx/-Xms)
如果可以的話。
# Decrease number of Java threads
這是怎麼做到的?
# Decrease Java thread stack sizes (-Xss)
建議值?它是預設的,但我不知道調整它是什麼。
# Set larger code cache with -XX:ReservedCodeCacheSize=
同樣,我們處於預設狀態。
$ swap -s total: 48607296k bytes allocated + 18201336k reserved = 66808632k used, 311770552k available
空閒 RAM 僅意味著其中沒有儲存任何內容。這並不意味著你可以使用它。報告的空閒 RAM 完全有可能不能被您的新 JVM 使用,因為其他應用程序已經保留了它。在任何情況下,JVM 就像大多數應用程序一樣不要求 RAM,而是要求虛擬記憶體。這很可能是您的系統遇到的問題,即缺少虛擬記憶體。
您將使用該命令了解您的虛擬記憶體使用情況:
swap -s
解決虛擬記憶體短缺的簡單方法就是增加(或創建)一個交換區,以便為記憶體預留提供一個備份儲存區。
編輯:根據您發布的其他資訊,您的應用程序無法分配更多虛擬記憶體的原因是因為您在記憶體上限到位的非全域區域中執行。非全域區域是容器,即它們都共享同一個核心。但是,可以限制它們的資源使用以防止一個區域干擾其他區域。
除了停止使用虛擬記憶體的其他程序之外,您無法在該區域執行任何操作,即使是 root 使用者也是如此。您需要要求全域區域管理員為您的區域授予更多虛擬記憶體,在您的情況下是
zone.max-swap
設置。