我一直在按照以下链接中的步骤尝试在MAC计算机上的Ubuntu VM上安装ONOS控制器:Download ONOS code & Build ONOS。
但是,执行以下命令后,构建过程将失败:
sort(colnames(test[1:ncol(test)] ))
以上命令输出以下内容:
~/onos$ bazel build onos
答案 0 :(得分:0)
您的输出显示java.lang.OutOfMemoryError: Java heap space
。您可以使用以下方法来增加javac
可用的内存量:
BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx512m"
如果仍然不起作用,请尝试逐步增加-Xmx
的尺寸。此问题将在以下位置进一步讨论:
答案 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>
将系统的交换文件(虚拟内存)增加到至少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)
要调整大小或删除交换文件::如果您需要调整刚刚制作的交换文件的大小,可以按以下方式删除它:
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
行。
在单词--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显示了通过环境变量进行设置。
完成!