虚拟内存耗尽:无法分配内存。

18
我的编译在ubuntu 12.10上失败了,只有300MB可用内存(总共750MB,MySQL占用350MB),处理器是1.5 GHz。我正在尝试将wt的基本“Hello World”文件改为一个简单的ajax页面。我相当确定这不是内存问题,因为我能够使用g++ -O3 -o hello hello.C -lwtfcgi -lwt -lboost_signals 编译原始的hello.C文件。

我相信我弄错了c ++,因为我从Wt :: Json示例中删除了HelloApplication :: HelloApplication(const WEnvironment&env):WApplication(env)的核心并替换成自己的代码。
HelloApplication::HelloApplication(const WEnvironment& env)
  : WApplication(env)
{
    Json::Object result;
    Json::parse("{ "
             "  \"a\": \"That's great\", "
             "  \"b\": true "
             "}",
             result);

    std::cerr << "Size: " << result.size(); << std::endl; // Size: 2
    WString s = result.get("a");
    bool b = result.get("b");
    std::cerr << "a: " << s << ", b: " << b << std::endl; // a: That's great, b: true
}

我是新手,对c++一无所知。我只能执行最简单的c++文件。

这里是hello world文件的源代码

这里是我获取json样例的地方。

**影响**

哇,c++的强大让我非常敬佩。

这完全摧毁了我的VPS。我无法重新启动。甚至无法重新安装我的发行版。

当我最终进入生产环境时,我想我会设置一个完全不同的开发系统,以防止类似情况影响我的生产系统。


不知道为什么有人给你点了踩,这似乎是个好问题。祝你好运……+1。 - Fantastic Mr Fox
4
我会尝试的第一件事是在Valgrind下运行程序,以查看是否发现任何内存泄漏问题。 - Voo
@Voo 谢谢你提供这个新工具!(对我来说是新的) - user1382306
2
如果您使用 g++ -g 编译程序,将在二进制文件中嵌入调试符号。然后,您可以使用 gdb 对二进制文件进行调试。在这里有一些快速的 gdb 命令会很有帮助,例如 r 运行程序,bt 在遇到任何崩溃或错误后跟踪回溯。这应该能够指出失败的确切位置。 - Tuxdude
@Tuxdude 谢谢!今晚我正在收集工具! - user1382306
4个回答

13

作为一个可能的快速解决办法:你可以通过执行以下操作来减少内存使用:

make -j 1

这告诉构建工具只使用一个CPU。对我有用。


老兄,你救了我。 - garbart
已经使用了这个,但仍然失败。很奇怪,因为之前相同的构建是可以工作的。 - Kvothe

5

只需要添加一个交换文件就可以解决这个问题!

// 创建一个1GB的交换文件

  1. dd if=/dev/zero of=/swapfile1 bs=1024 count=1048576
  2. chown root:root /swapfile1
  3. chmod 0600 /swapfile1
  4. mkswap /swapfile1
  5. swapon /swapfile1

// 编辑fstab文件

  1. vi /etc/fstab

// 在文件末尾添加下面一行

  1. /swapfile1 none swap sw 0 0

// 检查交换文件是否已经准备好

  1. free -m

1
如果只是为了编译某些东西而进行一次性的解决方案,那么无需更改fstab。 - axkibe

2

由于编译失败,出现内存不足的情况,可能是因为没有足够的内存来编译程序。这绝对不可能是因为接受的答案中所提到的“会话管理问题”。是mysql占用了过多的内存吗?300MB足以编译C++吗?

在Wt中,通过绑定到WServer对象的WResource来提供JSon(例如REST接口)。WApplication用于交互式用户界面。


如果那段小代码片段需要300MB才能编译通过,那就是一段非常庞大的代码!我可以运行一个更复杂的websocket++或java-websocket服务器,只需要几十MB。上述代码只是简单地接收一些JSON并将其部分输出到终端。 - user1382306

1

尝试使用 make -j 命令,让我的实时应用程序也可以正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接