如何在开发期间将对象保留在内存中

时间:2013-03-06 14:47:37

标签: java jvm

我的程序具有以下结构:

void main (String[] args) {
   Object largeObject = longInitialization();
   interestingLogic(largeObject);
}

longInitialization代码在开发期间永远不会更改。每当我更改有趣的逻辑时,我都必须再次运行程序并等待longInitialization完成。

不幸的是我无法序列化largeObject,因为它不是Serializable,我没有代码。

有没有可以节省初始化时间的技巧?也许,以某种方式在初始化之后保存JVM的状态,然后总是从该状态开始?

5 个答案:

答案 0 :(得分:2)

您可以对代码进行少量修改:

main(){
    Object largeObject = longInitialization();
    boolean debug = true;
    while(debug){
        interestingLogic(largeObject);
    }
}

现在以调试模式运行程序。在interestingLogic调用时设置断点并在IDE中使用代码热插拔调试模式。阅读更多关于Eclipe中的hotswap:Java Hotswap with Eclipses and Remote Debugging on Local Machine

//编辑:

还有一个选择。只需写一下largeObject的模拟。

答案 1 :(得分:1)

您需要一个新对象来调用interestingLogic(largeObject)。您可以在驱动程序等待用户输入时对新对象进行更改。

void main (String[] args) {
Object largeObject = longInitialization();

 boolean anotherTry = true;
 String answer = "";
 Scanner input = new Scanner(System.in);
 while (anotherTry) {
        Object newobject = NewObject();
        newobject.interestingLogic(largeObject).
        System.out.print("Run Again Y/N");
        answer = input.nextLine();
        if (answer.equalsIgnoreCase("N")) {
            anotherTry = false;
        }

    }
}

答案 2 :(得分:0)

如果不需要立即使用大对象,可以使用“延迟初始化”包装器来装饰它,并在您想要访问它之前调用“longInitialization”。

第二种解决方案可以通过将其编组/解组到xml文件来“克隆”它

答案 3 :(得分:0)

因为您说“...无法序列化largeObject ...”,所以无法在JVM生命周期内持久保存对象(因为您没有源代码)。但是,您有初始化/使用largeOject的代码。创建一个可序列化的debugLargeObject,其作用类似于真正的largeObject,并在开发期间使用debugLargeObject。

答案 4 :(得分:0)

不是没有很多工作。你需要一个次要的重构,如Guido所示,然后你需要每次通过循环(或其他)重新加载NewObject类。换句话说,每次更改代码时,您的VM都需要能够删除NewObject类,然后重新加载它。

有商业产品可以做到这一点(例如,参见JRebel)。您可以自己滚动(请参阅此StackOverflow主题:Unloading classes in java?)。如果你对你的有趣的逻辑非常小心,你可以热切换。但最终,你需要以某种方式换掉那个班级。