如何清除 JPype JVM 内存

问题描述

我目前正在开发一个 Django 应用程序,它允许用户编写他们的代码并在服务器端编译它,有点像 CodeAcademy、W3Schools 等。

为了实现Java代码的编译和执行,我尝试使用JPype。我目前编写的代码接收输入的Java代码,将其编译成.class文件,然后执行文件

我的问题是这个过程只能发生一次。如果输入代码发生更改,则输出始终相同。我假设这是因为代码仍在 JVM 的内存中,因为如果我重新启动服务器,代码将再次正确编译。

以下是我为此过程编写的代码

def compile_java_code(request):
""" Function for compiling JavaScript code """
    untrustedCode = request.GET.get('untrustedCode')
    untrustedCode = untrustedCode.lstrip()
    username = str(request.user)

    className = re.search('class(.*?){',untrustedCode).group(1)
    className = className.replace(" ","")

    untrustedCode = untrustedCode.replace(className,username)
    f = open(("temp/"+username+".java"),"x")
    f.write(untrustedCode)
    f.close()
    classFile = CLASS_DIR + ("\\"+username+".class")

    try:
        compile_java(CLASS_DIR + ("\\"+username+".java"))
    except subprocess.CalledProcessError:
        data = {'output': "Syntax error with the input code - Could not compile. Check through your code."}
        os.unlink(f.name)
        return JsonResponse(data)
    except OSError:
        data = {'output': "Class Could not be found. Please revert class name to original name."}
        os.unlink(f.name)
        return JsonResponse(data)

    try:
        T = jpype.JClass(username)
        t = T()
        result = t.test()
        data = {'output': str(result)}
        os.unlink(f.name)
        os.remove(CLASS_DIR+"\\"+username+".class")
    except Exception as e:
        data = {'output': "Error with the input code. Take another look at your code.\n\n" + str(e)}
        if(f.name):
            os.unlink(f.name)
        if(os.path.exists(classFile)):
            os.remove(CLASS_DIR+"\\"+username+".class")
    return JsonResponse(data)

def compile_java(java_file):
    subprocess.check_output(['javac',java_file])

代码首先接收用户输入的代码并将类名替换为他们的用户名。这是为了确保没有两个文件名相同。

然后我将代码保存到一个 .java 文件中,以便在 compile_java() 函数中进行编译。这个函数创建一个 .class 文件,JPype 然后用它来运行 classes 方法。然后返回结果。

正如我之前所说,无论何时运行此代码,第一次执行时返回的任何内容都将继续返回。

我知道 JPype 还不允许您重新启动 JVM,但是有什么方法可以在编译后清除 JVM 的内存吗?

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...