1. 程式人生 > >初始化虛擬機器錯誤 - Error occurred during initialization of VM

初始化虛擬機器錯誤 - Error occurred during initialization of VM

文章目錄

1 環境配置資訊

1.1 伺服器配置資訊

伺服器是物理機, 配置資訊如下:

CPU型號 CPU個數 CPU核數 CPU執行緒數 記憶體
Intel® Xeon® CPU E5-2630 v4 @ 2.20GHz 2個 2 * 10 = 20個核 2 * 20 = 40個執行緒 126G

1.2 Tomcat啟動引數

檢視$TOMCAT_HOME/bin/catalina.sh檔案, 其中JVM引數配置資訊如下:

JAVA_OPTS="-server -Xms90g -Xmx90g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"

2 問題描述

在伺服器(CentOS-6.5)中部署專案上線前的模擬測試環境, 啟動Tomcat時, 丟擲如下錯誤:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

即:

初始化VM時出錯, 無法為heap(堆)物件保留足夠的空間.

錯誤: 無法建立Java虛擬機器.

錯誤: 發生了致命異常. 程式將會退出.

3 問題解決

根據問題描述可知, Linux系統不允許初始化JVM時就申請這麼大的記憶體.

  • JVM可用記憶體測試方法:

    # 配置好JDK的環境變數後, 在終端鍵入如下命令: 
    java -Xmx32g -version
    
    # 如果能夠正常顯示JDK的版本資訊, 說明可以申請到指定大小的記憶體. 
    # 若報錯, 說明申請的記憶體大小超出限制, 不被作業系統所允許. 
    
  • 繼續檢視系統資源限制情況:

    # 在終端鍵入如下命令: 
    ulimit -a
    # 發現記憶體的使用並未受限: 
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    

經過排查, 原來同事在測試Greenplum DB時, 修改了/etc/sysctl.conf檔案中的系統核心引數.

# 將如下引數的值設定為1或0
vm.overcommit_memory=2

# 儲存退出後, 使得更改生效: 
sysctl -p

此時再次啟動Tomcat, 發現啟動成功.

4 關於vm.overcommit_memory引數的說明

vm.overcommit_memory表示系統核心在分配記憶體時做檢查的方式.

此引數有 [0、1、2] 3個值可選, 處理方式定義在核心原始碼mm/mmap.c_vm_enough_memory函式中.

4.1 vm.overcommit_memory=0

預設設定. 巨集為OVERCOMMIT_GUESS.

核心計算: NR_FILE_PAGES總量 + SWAP總量 + slab中可以釋放的記憶體總量, 如果申請空間超過此數值, 則將此數值與空閒記憶體總量減掉 totalreserve_pages() 的總量相加. 如果申請空間依然超過此數值, 則分配失敗.

該設定可能造成記憶體超載, 但也可以提升大量使用記憶體的任務的效能.

4.2 vm.overcommit_memory=1

巨集為OVERCOMMIT_ALWAYS.

函式直接 return 0, 分配成功.

4.3 vm.overcommit_memory=2

巨集為OVERCOMMIT_NEVER.

核心計算: 總實體記憶體 * vm.overcommit_ratio / 100 +SWAP總量, 如果申請空間超過此數值, 則分配失敗. vm.overcommit_ratio 預設值為50.

該設定可以有效減少記憶體過度使用的風險.

4.4 檢視系統的可用記憶體

檢視命令如下:

[[email protected] ~]# grep -i commit /proc/meminfo
CommitLimit:    66020980 kB
Committed_AS:   100135888 kB
  • CommitLimit: 當前系統還可以申請的總記憶體;
  • Committed_AS: 當前系統中所有應用申請了的總記憶體 —— 只是申請, 並未完全分配.

參考

https://blog.csdn.net/qq_16097611/article/details/52816908

https://www.cnblogs.com/xianbei/archive/2012/11/23/2783800.html

版權宣告

作者: ma_shoufeng(馬瘦風)

出處: CSDN 馬瘦風的部落格

您的支援是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究相關人員法律責任的權利.