Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory


遇到問題

在服務器上運行 nexus 出現Native memory allocation (mmap) failed to map 838860800 bytes for committing reserved memory問題。

原因:查資料后是因為運行 nexus 需要 800m 的內存,而機器配置是1G,剩余可用的只有幾十兆,所以導致無法啟動

解決辦法

方法一: 擴大機器配置;

方法二: 設置交換內存swap(一般設置為內存的兩倍大小);

dd if=/dev/zero of=/tmp/swapfile bs=1024k count=256
#格式化文件
mkswap /tmp/swapfile
#加載交換文件
swapon /tmp/swap
#永久生效
vim /etc/fstab
#最后一行添加
/swap1                  swap                    swap    defaults        0 0
   
   
  
  
          

方法三:設置虛擬機的啟動參數

# Xms: 初始化堆內存(heap)
# Xmx: 最大堆內存
# PermSize: 初始化永久內存,存儲class類,不會被GC
# MaxPermSize: 最大永久內存
# Xss: 每增加一個線程(thread)就會立即消耗的內存,而最佳值應該是128K,默認值好像是512
JAVA_OPTS=-Xss128k -Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=1024m
   
   
  
  
          

在這里補充下堆和棧的區別(這個堆和棧不是數據結構的堆和棧)

棧中分配局部變量空間,堆區是向上增長的用於分配程序員申請的內存空間。另外還有靜態區是分配靜態變量,全局變量空間的;只讀區是分配常量和程序代碼空間的;以及其他一些分區。
來看一個網上很流行的經典例子:
main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = “abc”; 棧
char *p2; 棧
char *p3 = “123456”; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
關於堆和棧區別的比喻
堆和棧的區別可以引用一位前輩的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

原文地址:https://blog.csdn.net/byg184244735/article/details/79832217


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM