我们的SYZOJ安装之后导了题目之后才发现java编译器一直有问题,一直在显示编译错误。
image-20210117090126862
大概的报错信息如下:

[0.008s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 4k, detached.
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create worker GC thread. Out of system resources.
# An error report file with more information is saved as:
# /sandbox/2/hs_err_pid4.log

我在stackoverflow上尝试搜索此错误

Jmeter gives java.lang.OutOfMemoryError beyond 2000 threads, even after increasing the heap size to maximum - Stack Overflow

并且找到了修改线程限制的方案:

How to Set Limits for User Running Processes in Linux (tecmint.com)

但是由于judge端运行在沙箱,因此我并没有找到合适的修改方案。于是,我的室友在tg群咨询了此问题

image-20210117085443864

根据tg群大神提供的思路,我试着提升了一下线程数量,我试着将内存扩大十倍,然后将编译线程和run线程提升到64,目前依然无法解决这个问题。

image-20210117082259272

接着爆出如下错误:

[0.030s][warning][os,thread] Failed to start thread - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 0k, detached.
Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

恕我才识浅薄,遇到此问题折腾了很久都没找到解决的方式,经过大量的资料查阅和搜索引擎的搜索,大概确定了问题出现在sandbox的jvm内存分配上。

参考:Tomcat中JVM内存溢出及合理配置_ye1992的专栏-CSDN博客_tomcat 内存溢出

三种内存溢出异常介绍

1. OutOfMemoryError: Java heap space 堆溢出

内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

2. OutOfMemoryError: PermGen space 非堆溢出(永久保存区域溢出)

这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

3. OutOfMemoryError: unable to create new native thread. 无法创建新的线程

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。

也就是说,这个错误的信息是由于无法创建新的线程引起的,而且有个很奇怪的现象就是,我查看judge端源代码,默认给judge分配的内存是2G,而我们的服务器却是有着32G的物理内存的。

而我在谷歌上搜索发现,大部分关于修改jvm内存的方式都是在tomcat的配置文件下修改的,而我目前毫无对策,我太菜了

如有解决方案我将继续更新,如无,那就先这样吧。

解决问题

如果您所搭建的OJ正好也有此问题,那就说明目前您的服务器的内存是在大于4GB的,此原因是大概是因为syzoj使用的沙箱的jdk版本是32位,不支持64g以上的内存。

我在virturlbox中安装ubuntu1804 分配了8核8G内存,安装之后依旧是出现此问题,最后结合上方链接的分析,内存越大可创建的线程越小,然后我又联想到很多oj系统使用的服务器配置并不是很高,于是我就尝试着把内存调整到4gb,再提交代码居然通过了,当时真的是要吐血了。

高配置服务器建议虚拟化,同时,也可以开多个评测机一起使用。

版权声明
本文作者珂泽
文章来源风也雨忆笙
原文链接
转载说明非特殊说明文章均为原创,页脚已标识是否允许转载,转载请注明出处!感谢您的支持!
微信公众号
最后修改:2021 年 01 月 22 日 09 : 37 PM
如果您觉得我的文章有帮助,请随意赞赏!