运行bazel构建时出现java.lang.OutOfMemoryError

时间:2019-03-15 20:32:40

标签: controller bazel sdn onos

我一直在按照以下链接中的步骤尝试在MAC计算机上的Ubuntu VM上安装ONOS控制器:Download ONOS code & Build ONOS

但是,执行以下命令后,构建过程将失败:

sort(colnames(test[1:ncol(test)] ))

以上命令输出以下内容:

~/onos$ bazel build onos

2 个答案:

答案 0 :(得分:0)

您的输出显示java.lang.OutOfMemoryError: Java heap space。您可以使用以下方法来增加javac可用的内存量:

BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx512m"

如果仍然不起作用,请尝试逐步增加-Xmx的尺寸。此问题将在以下位置进一步讨论:

https://github.com/bazelbuild/bazel/issues/1308

答案 1 :(得分:0)

如果Bazel出现以下错误的任何版本均失败,则是因为尝试构建时堆空间不足。

错误:

java.lang.OutOfMemoryError: Java heap space

我在粘贴的输出中看到该错误。尽管鲜为人知,但某些大型项目和Mono-repos可能需要16GB或更多的堆,因此我建议您在Linux构建计算机上创建一个32GB〜64GB的大型交换文件(虚拟内存),然后它一起运行!全力以赴!

注意:如果您具有标准HDD(旋转硬盘驱动器),则可能会导致构建运行速度降低几十倍甚至几百 < / strong>比使用物理RAM来构建!这是因为HDD的速度太慢了!

BUUUUT :如果您拥有2.5英寸或3.5英寸SSD(固态驱动器),则它可以正常运行,或者如果您拥有 m.2 外形SSD!这是因为m.2形状的SSD令人难以置信的快,所以您可以一直使用巨大的交换文件来代替RAM,因为这些磁盘运行非常快!

如果使用顶级的内部m.2外形尺寸SSD,我希望使用虚拟内存进行的以下构建仅比使用物理RAM(相同大小)慢大约2倍。建立。但是,如果您有一个超级慢速旋转的HDD,则在内部m.2 SSD上使用交换文件进行相同的构建可能需要2个小时,而在旋转的HDD上使用交换文件可能要花费*多天*或更长时间。

当然,您的结果可能会有所不同,但是您希望使用较小的JVM堆堆(以使用较少的虚拟内存),而期望虚拟内存(交换文件)的速度会变慢。 < / p>

  1. 将系统的交换文件(虚拟内存)增加到至少32〜64 GB。要添加或删除交换文件,请遵循此处的详细说明:https://linuxize.com/post/how-to-add-swap-space-on-ubuntu-18-04/。简而言之,这是如何添加交换文件

    sudo fallocate -l 64G /swapfile # create a 64 GB file
    sudo chmod 600 /swapfile        # set permissions to rw for ONLY the user (root!)
    sudo mkswap /swapfile
    sudo swapon /swapfile
    sudo gedit /etc/fstab           # edit the /etc/fstab file to make these changes persistent (load them each boot)
    # ADD this line to bottom (w/out the # comment symbol):
    # /swapfile swap swap defaults 0 0
    sudo swapon --show              # verify this new 64GB swap file is now active
    cat /proc/sys/vm/swappiness     # not required: verify your systems "swappiness" value is 60 or so (range is 0 to 100)
    
    1. 要调整大小或删除交换文件::如果您需要调整刚刚制作的交换文件的大小,可以按以下方式删除它:

      sudo swapoff -v /swapfile # turn swap file off
      sudo swapon --show  # verify the swap file is off
      free -h             # you can also look at this as an
                          # indication the swap file is off
      sudo rm /swapfile   # remove the swap file
      

      然后,您可以再次按照上述说明以新大小重新创建它,或者,如果要永久删除它,则需要编辑 / etc / fstab 文件以删除您先前添加到其底部的/swapfile swap swap defaults 0 0行。

  2. 在单词--host_jvm_args=-Xmx32g的紧后面添加bazel到任何bazel命令中。这会将 max Java虚拟内存(或在这种情况下的bazel构建堆)设置为32GB,一旦物理RAM装满,它就会进入交换文件。如果您有一个高速SSD驱动器,该驱动器在交换时将运行得异常好,则应等待最多几个小时,具体取决于存储库的大小。如果您使用的是旧的旋转硬盘,则预期需要2小时才能在内部m.2 SSD上使用交换文件构建一个回购协议,最多可能需要数天来构建交换文件。缓慢旋转的硬盘-尤其是外部硬盘而不是内部硬盘。

    下面是一个完整的bazel命令示例,其中添加了此bazel启动选项,以构建整个存储库:

    time bazel --host_jvm_args=-Xmx32g build //...
    

    ...代替这个:

    time bazel build //...
    

    这里的time附加项仅打印出了更清晰的打印输出,显示了构建花费了多长时间(我喜欢)。只需确保在任何需要的bazel构建命令中设置分配给bazel的最大Java虚拟内存,只要在需要时将--host_jvm_args=-Xmx32g放在单词bazel之后即可。

    请注意,像在此处使用-Xmx一样设置 max 堆与设置其他-Xms可能会使用的默认堆不同。设置最大堆仍然从默认堆开始,但是根据需要让其增长。 The other answer显示了通过环境变量进行设置。

完成!

参考:

  1. ***** https://linuxize.com/post/how-to-add-swap-space-on-ubuntu-18-04/
  2. https://serverfault.com/questions/684771/best-way-to-disable-swap-in-linux/684792#684792