遇到問題
在服務器上運行 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
在這里補充下堆和棧的區別(這個堆和棧不是數據結構的堆和棧)
原文地址:https://blog.csdn.net/byg184244735/article/details/79832217棧中分配局部變量空間,堆區是向上增長的用於分配程序員申請的內存空間。另外還有靜態區是分配靜態變量,全局變量空間的;只讀區是分配常量和程序代碼空間的;以及其他一些分區。
來看一個網上很流行的經典例子:
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); 堆
}
關於堆和棧區別的比喻
堆和棧的區別可以引用一位前輩的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。