查看原文
其他

jimmy 2018-06-03

最近新购置云服务器一枚,运行几个java软件的时候发生了非常诡异的错误,程序总是被无缘无故的kill掉,但是本身并没有消耗多少内存或者cpu,起初我不停地测试该程序,盯着top命令结果看了半小时发现了root命令启动了 kswapd0进程 才导致该java程序被终止,所以我就沿着这个思路去搜解决方案。

虽然路是错的,但是搜索学到了几个新的知识:

  • 死磕内存篇 --- JAVA进程和linux内存间的大小关系

  • 死磕内存篇2 --JAVA进程是怎么突然挂掉的

隐隐约约好像明白了问题所在,又不得其法,只好求助于云服务器的工程师。但是问题很难描述清楚,我又重新调试程序,终于拿到了log日志,如下:

  1. OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000004bb800000, 3355443200, 0) failed; error='Cannot allocate memory' (errno=12)

  2. #

  3. # There is insufficient memory for the Java Runtime Environment to continue.

  4. # Native memory allocation (mmap) failed to map 3355443200 bytes for committing reserved memory.

  5. # An error report file with more information is saved as:

  6. # /home/tercent/hs_err_pid18247.log

所以要根据教程,在Ubuntu系统里面增加swap空间;https://help.ubuntu.com/community/SwapFaq

  1. sudo dd if=/dev/zero of=/mnt/10GiB.swap bs=1024 count=10485760

  2. sudo chmod 600 /mnt/10GiB.swap

  3. sudo mkswap /mnt/10GiB.swap

  4. sudo swapon /mnt/10GiB.swap

  5. echo '/mnt/10GiB.swap swap swap defaults 0 0' | sudo tee -a /etc/fstab

但是我本身是非常奇怪的,为什么默认不给swap区域了呢?查了下说明书

Linux服务器默认不提供SWAP盘说明

也就是说其实swap空间是可以省略的,因为内存已经足够大了,但是我运行的软件比较老旧,它默认需要这些东西,所以就尴尬了。

那到底什么才是落后呢?是开发语言吗?是编程规则吗?还是内存呢?当时的程序员怎么会想到未来的内存如此便宜,连swap都可以省略了呢?

不管怎么样,自己的脑子不能落后!


点击下面的阅读原文,上面的链接可以跳转。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存