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

Java 如何在开发期间将对象保留在内存中,java,jvm,Java,Jvm,我的程序具有以下结构: void main (String[] args) { Object largeObject = longInitialization(); interestingLogic(largeObject); } 纵向初始化代码在开发过程中从不更改。但每当我改变兴趣逻辑时,我都必须再次运行程序,等待纵向初始化完成 不幸的是,我无法序列化largeObject,因为它不可序列化,而且我没有用于它的代码 有什么技巧可以节省初始化时间吗?也许,以某种方式在初始化之后保存

我的程序具有以下结构:

void main (String[] args) {
   Object largeObject = longInitialization();
   interestingLogic(largeObject);
}
纵向初始化代码在开发过程中从不更改。但每当我改变兴趣逻辑时,我都必须再次运行程序,等待纵向初始化完成

不幸的是,我无法序列化largeObject,因为它不可序列化,而且我没有用于它的代码


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

您可以对代码进行一些修改:

main(){
    Object largeObject = longInitialization();
    boolean debug = true;
    while(debug){
        interestingLogic(largeObject);
    }
}
现在在调试模式下运行程序。在调用时将断点设置为
interestingLogic
并在IDE中使用代码热交换调试模式。阅读有关Eclipe中热交换的更多信息:

//编辑:


还有一个选择。只需编写大型对象的mock,如果不需要立即使用大型对象,可以使用“lazy initialization”包装器对其进行修饰,并在访问之前调用“longInitialization”


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

您需要一个新对象来调用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;
        }

    }
}

因为您说过“…无法序列化largeObject…”,所以无法跨JVM生命周期持久化对象(因为您没有源代码)。但是,您有初始化/使用LargeObject的代码。创建一个可序列化的debugLargeObject,其行为类似于真实的largeObject,并在开发过程中使用debugLargeObject

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


有一些商业产品可以做到这一点(例如,参见JRebel)。您可以自己滚动(请参阅此StackOverflow主题:)。如果你对你感兴趣的逻辑非常谨慎,你可以进行热交换。但最终,您需要以某种方式替换掉该类。

您可以在调试时热部署代码。对于Oracle JVM,这可能足够有用了。好吧,您可以将largeObject放入ArrayList并序列化数组列表。@sk2212这不会帮助您回答5个问题,也不会有您的回复或评论。这完全是浪费时间吗?@Guido答案看起来不错,但我还没有时间在实践中尝试。请耐心等待…谢谢,这也是一个不错的选择,虽然时间稍长。