小编Jor*_*dan的帖子

Java动态加载和卸载.java文件,垃圾收集?

我正在创建一个将长时间运行的Java应用程序,这需要更新的功能而无需关闭.我决定通过以.java文件(从数据库中拉出一个字节数组)的形式加载它来提供这个更新的功能,这些文件在内存中编译并实例化.如果你有更好的方式,我全都耳朵.

我遇到的问题是,当我在人工环境中进行一些测试时,每次加载这些"脚本"的周期内存占用量会略有增加.

注意:这实际上是我第一次使用java做这样或类似的事情.我之前在C#中已经完成了这样的事情,加载和卸载.cs文件,并且还有内存占用问题...解决我将它们加载到一个单独的appdomain中,当我重新编译文件时,我只是卸载了那个appdomain并创建了一个新的一个.

入口点


这是我在长时间使用(许多重新编译循环)后用来模拟内存占用的入口方法.我运行这个很短的时间,很快就会吃掉500MB +.

这只是临时目录中的两个虚拟脚本.

public static void main( String[ ] args ) throws Exception {
    for ( int i = 0; i < 1000; i++ ) {
        Container[ ] containers = getScriptContainers( );
        Script[ ] scripts = compileScripts( containers );

        for ( Script s : scripts ) s.Begin( );
        Thread.sleep( 1000 );
    }
}
Run Code Online (Sandbox Code Playgroud)

收集脚本列表(临时)


这是我用来收集脚本文件列表的临时方法.在生产过程中,这些实际上将作为字节数组加载,并带有一些其他信息,例如数据库中的类名.

@Deprecated
private static Container[ ] getScriptContainers( ) throws IOException {
    File root = new File( "C:\\Scripts\\" );
    File[ ] files …
Run Code Online (Sandbox Code Playgroud)

java memory class loading dynamic

12
推荐指数
1
解决办法
2734
查看次数

标签 统计

class ×1

dynamic ×1

java ×1

loading ×1

memory ×1