Git使⽤⼩坑Outofmemory错误的解决⽅法
最近公司将内部使⽤的代码由svn迁到了git上,所以也必须学者使⽤Git命令。
虽说git的模式和svn区别很⼤,但想必也不是什么难事。但没曾想在第⼀步git clone的时候就踩到了⼀个⼤坑……废话不多提,先看错误代码:
复制代码代码如下:
Cloning
remote: Couting objects: 125627, done.
remote: Compressing objects: 100% (47061/47061), done.
fatal: Out of memory, malloc failed (tried to allocate 1941159936 bytes)
就这⼏⾏错误码,⽣⽣的把我给绊住了⼀天……
0x00 调内存
看到“Out of memory, malloc failed”,第⼀反应是内存不⾜。毕竟虚拟机内存太⼩,Debian的虚拟机只给了512M的内存,再加上⾃⼰没事⿎捣着玩,⾃⼰装了⼀堆乱七⼋糟的程序,free的只有⼏⼗兆了。
于是果断把乱七⼋糟的进程结束掉,服务停掉,没⽤的东西全关了。最后⼜把虚拟机的内存调到了1G.
结果——fatal依然……
0x01 调配置
后来⼜看了下这句——“allocate 1941159936 bytes”——这是1.8G啊……这能有多⼤内存给他啊……调内存显然不是办法。于是上⽹搜了⼀下这个报错,发现都是让调配置的:
复制代码代码如下:
git config --global pack.threads 1 git
config --global pack.deltaCacheSize = 128m
git config --global pack.windowMemory 50m
顺便吐槽⼀句——国内博客全都在抄这个配置……还把Cache抄成了Chase……复制都不会么……
这样⼀来,应该是可以减⼩资源的占⽤,但遗憾的是貌似git根本没拾这茬,依然是义⽆反顾的申请了1.8个G的空间……
当然,结果——再⼀次的fatal依然……
另外,我还了另⼀个哥们做了个试验,他的虚拟机⾥就可以正常clone(1G内存,free不到100M),⽽我⼿上的两个虚拟机则都⽆法正常clone(1G内存,free超过800M 和 2G内存,free将近1.3G)。看起来和内存没什么关系了
0x02 调swap
让我眼前⼀亮的是这个帖⼦⾥贴出的错误代码和我的⼏乎⼀模⼀样,⽽且在⼀开始就写明了上⾯的所谓配置⽅案都已经试过了,但依然⽆效——和我遇到的情况完全⼀样。不过他最后的结果是:
In the end i had to kill old & create new repo.
貌似是没到什么好的解决⽅案……
但当我翻到最下⾯的时候眼前⼀亮——“To get around this I temporarily created a large ”。“a large swap”……醍醐灌顶啊……我⽴马问了下能正常clone的那个哥们的虚拟机给了多少swap空间,得到的答复是2G,⽽我⼿⾥的——1G和0……和0……和……0……0……0……
原来我需要的是⼀个⼤的swap!
使⽤Method2,完美解决。
git使用详解Method 2: Use a File for Additional Swap Space
If you don't have any additional disks, you can create a file somewhere on your filesystem, and use that file for swap space. The following dd command example creates a swap file with the name “myswapfile” under /root directory with a size of 1024MB (1GB).
复制代码代码如下:
# dd if=/dev/zero of=/root/myswapfile bs=1M count=1024
1024+0 records in
1024+0 records out
# ls -l /root/myswapfile
-rw-r--r--    1 root    root    1073741824 Aug 14 23:47 /root/myswapfile
Change the permission of the swap file so that only root can access it.
复制代码代码如下:
# chmod 600 /root/myswapfile
Make this file as a swap file using mkswap command.
复制代码代码如下:
# mkswap /root/myswapfile
Setting up swapspace version 1, size = 1073737 kB
Enable the newly created swapfile.
复制代码代码如下:
# swapon /root/myswapfile
To make this swap file available as a swap area even after the reboot, add the following line to the /etc/fstab file.
复制代码代码如下:
# cat /etc/fstab
/root/myswapfile              swap                    swap    defaults        0 0
Verify whether the newly created swap area is available for your use.
复制代码代码如下:
# swapon -s
Filename                        Type            Size    Used    Priority
/dev/sda2                      partition      4192956 0      -1
/root/myswapfile                file            1048568 0      -2
# free -k
total      used      free    shared    buffers    cached
Mem:      3082356    3022364      59992          0      52056    2646472
-/+ buffers/cache:    323836    2758520
Swap:      5241524          0    5241524
Note: In the output of swapon -s command, the Type column will say “file” if the swap space is created from a swap file.
If you don't want to reboot to verify whether the system takes all the swap space mentioned in the /etc/fstab, you can do the following, which will disable and enable all the swap partition mentioned in the /etc/fstab
复制代码代码如下:
# swapoff -a
# swapon -a
说实在的我⼀直不太关⼼swap的⼤⼩,总觉得没啥⽤处。这⼀次就让我长记性了——swap还是必要的!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。