【问题标题】:How to keep an object in memory during development如何在开发过程中将对象保留在内存中
【发布时间】:2013-03-06 14:47:36
【问题描述】:

我的程序结构如下:

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

longInitialization 代码在开发过程中永远不会改变。但是每当我改变了有趣的逻辑时,我必须再次运行程序并等待 longInitialization 完成。

很遗憾,我无法序列化 largeObject,因为它不可序列化而且我没有代码。

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

【问题讨论】:

  • 能否在调试时热部署代码。对于 Oracle JVM,这可能就足够有用了。
  • 嗯,可以把 largeObject 放到一个 ArrayList 中,序列化数组列表。
  • @sk2212 这无济于事
  • 为您提供 5 个答案,您这边没有回复或评论。这完全是浪费时间吗?
  • @Guido 答案看起来不错,但我还没有时间在实践中尝试它们。请耐心等待...

标签: java jvm


【解决方案1】:

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

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

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

//编辑:

还有一个选择。只需编写 largeObject 的模拟即可。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢,这也是一个不错的选择,虽然时间长了一点。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-22
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          • 1970-01-01
          相关资源
          最近更新 更多