我们正在尝试构建一个java代码编译器来创建在线编码测试。我们通过REST API将源代码发布到端点。接下来,我们将针对测试文件编译和执行输出,然后将结果返回给客户端。
这里的挑战是我们为每个请求旋转一个进程javac - compile code
和java - execute code
,实际上每个进程占用30MB内存和600ms。
这是非常巨大的,我们无法在八核和16 on上处理1000个用户的负载。如果我们一次收到200个请求,就会产生200个繁重的进程,其他请求也在排队等待。
我们能想到的解决方案
javac
,而是如何重用它(javac一旦编译成功就会自我终止应该编译字符串输入,而不是从文件编译。javac
我们只是好奇在线编码竞赛平台是如何解决这些问题的?我们只针对Java。任何帮助都是非常感谢的。
https://www.journaldev.com/937/compile-run-java-program-another-java-program
发布于 2018-09-15 03:15:47
从Java 1.6开始,Java就有了一个可编程的API来访问Java编译器,而无需使用子进程。作为起点,请参阅documentation for the JavaCompiler class。
发布于 2018-09-15 03:48:50
您可以使用javax.tools.JavaCompiler类动态编译java文件。下面是一段代码片段,可以帮助您入门。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
List<String> optionList = new ArrayList<String>();
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null,
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(javaFiletoCompile)));
if (task.call())
{
//success
} else
{
//fail
}
fileManager.close();
https://stackoverflow.com/questions/52336220
复制相似问题