2013-03-06 25 views
2
過程中保持一個對象在內存

我的程序結構如下:如何發展

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

的longInitialization代碼開發過程中不會改變。只要我更改有趣的邏輯,我必須再次運行程序並等待longInitialization完成。

不幸的是我不能序列largeObject因爲無法序列化,我沒有代碼它。

是否有一個把戲,我可以節省初始化時間?也許,在某種程度上在初始化之後保存JVM的狀態,然後始終從該狀態開始?

+0

您可以在調試時熱部署代碼。對於可能足夠有用的Oracle JVM。 – 2013-03-06 14:50:28

+0

那麼,你可以把largeObject放入一個ArrayList並序列化數組列表。 – sk2212 2013-03-06 14:51:32

+2

@ sk2212這將不會幫助 – 2013-03-06 14:53:28

回答

2

可以使代碼稍加修改:

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

現在在調試模式下運行程序。在IDE中設置斷點interestingLogic調用並使用代碼熱插拔調試模式。瞭解更多關於在熱插拔的Eclipe:Java Hotswap with Eclipses and Remote Debugging on Local Machine

//編輯:

還有一個選項。只要寫模擬largeObject

+0

短而重要。謝謝。 – 2013-03-19 12:06:45

0

如果不立即需要的大對象,你可以用「懶惰初始化」包裝裝飾它,你要訪問它之前調用「longInitialization」。

第二種解決方案可以通過編組/解組它到一個XML文件

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; 
     } 

    } 
} 
+1

謝謝,這也是一個不錯的選擇,雖然它稍長一點。 – 2013-03-19 12:07:09

0

因爲你說:「......不能序列largeObject ......」沒有辦法堅持跨越JVM壽命的對象(因爲你沒有源)。但是,您擁有初始化/使用largeOject的代碼。創建一個可串行化的debugLargeObject,它的作用與真正的largeObject類似,並在開發過程中使用debugLargeObject。

0

不是沒有很多的工作。您需要一個次要的重構,如Guido所示,那麼您需要每次通過循環(或其他)重新加載NewObject類。換句話說,每次更改代碼時,您的VM都需要能夠移除NewObject類,然後重新加載它。

有哪些做商業產品(見JRebel的,例如)。你可以推出你自己的(見這個StackOverflow主題:Unloading classes in java?)。如果你對你的有趣的邏輯非常小心,你可以熱切換。但最終,你需要以某種方式替換這個類。