【问题标题】:virtual memory exhausted: Cannot allocate memory虚拟内存耗尽:无法分配内存
【发布时间】:2013-03-04 02:20:55
【问题描述】:

我在 ubuntu 12.10 上编译失败,可用内存为 300mb(总共 750mb,MySQL 为 350mb),1.5ghz,我正在尝试将 wt 的基本 hello world 文件重新编写为一个简单的 ajax 页面。我很确定这不是内存问题,因为我能够使用 g++ -O3 -o hello hello.C -lwtfcgi -lwt -lboost_signals 编译原始的 hello.C 文件。

我确定我搞砸了 c++,因为我撕掉了 HelloApplication::HelloApplication(const WEnvironment& env) : WApplication(env) 的内容并放入了 Wt::Json 示例中的示例

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++ 文件。

这是原来的source to the hello world file

这是我得到the json sample from的地方。

** 影响**

哇,我对 c++ 的威力简直太敬佩了。

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

当我最终投入生产时,我想我将建立一个完全不同的开发系统,以防止此类事情扼杀我的生产系统。

【问题讨论】:

  • 不知道为什么有人对你投了反对票,这似乎是一个好问题。祝你好运……+1。
  • 我尝试的第一件事是在 valgrind 下运行程序,看看它是否发现任何内存泄漏。
  • @Voo 谢谢你的新工具! (对我来说是新的)
  • 另外,如果使用g++ -g 编译您的程序,您将在二进制文件中内置调试符号。然后你可以在二进制文件上运行gdb 来执行一些调试。在这里有用的快速 gdb 命令是 r 运行程序,bt 在遇到任何崩溃或错误后回溯。这应该会为您指出确切的故障点。
  • @Tuxdude 谢谢!今晚我要准备好工具了!

标签: c++ json compiler-errors virtual-memory wt


【解决方案1】:

作为一个潜在的快速解决方案:您可以通过这样做来减少内存使用量

make -j 1

告诉构建工具只使用一个 CPU。为我工作。

【讨论】:

  • 哥们你救了我
【解决方案2】:

由于您的编译因内存不足而失败,因此可能没有足够的内存来编译您的程序。这不可能是因为接受的答案中建议的“会话管理问题”。 mysql吃得比它应该吃的多吗? 300MB 足够编译 C++ 了吗?

在 Wt 中服务 JSon(类似于 REST 接口)是通过绑定到 WServer 对象的 WResource 完成的。 WApplication 用于交互式用户界面。

【讨论】:

  • 如果那一小段代码不能用 300mb 编译,那就是一大堆代码!我可以运行一个更复杂的 websocket++ 或 java-websocket 服务器,只需 10 mb。上面所做的只是接收一些 json 并将其部分输出到终端。
【解决方案3】:

只需添加一个交换文件即可解决此问题!

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

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

// 编辑 fstab 文件

  1. vi /etc/fstab

//在文件末尾追加以下行

  1. /swapfile1 无交换 sw 0 0

// 检查交换是否准备好

  1. 免费 -m

【讨论】:

  • 如果 fstab 只是一次编译的解决方法,则无需更改。
猜你喜欢
  • 2014-05-14
  • 1970-01-01
  • 2012-12-09
  • 2014-04-23
  • 1970-01-01
  • 2017-12-16
  • 2011-04-12
  • 2011-03-08
  • 1970-01-01
相关资源
最近更新 更多