2017-03-22 153 views
0

我正在嘗試編寫守護進程。以下是我的示例代碼片段。無限循環內Java對象創建

public void listener() { 
    MyObject obj = null; 

    while(true) { 
     obj = new MyObject(); 
     obj.process(); 
    } 
} 

還是我來創建這樣

public void listener() { 
    MyObject obj = new MyObject(); 

    while(true) { 
     obj.process(); 
    } 
} 

process()方法做數據庫selectinsert into表,連接網絡服務,並得到響應消息,併發送消息給用戶。

哪一個是正確的方法?

+1

這取決於'MyObject'和'MyObject.process'是什麼,這件事甚至應該做什麼。 – user2357112

+0

進程將執行.. db選擇並插入,連接web服務並處理消息。 – Easy2DownVoteHard2Ans

回答

0

很好的問題,爲新鮮。我很感激。

第一個,這將爲循環的每次迭代創建一個新的Object o。垃圾收集器會經常清理。

第二個,因此它將一直可用。如果你想一直重複使用這個對象,那就去做吧。

既然它是無限的過程,那麼就去第二個選項重用對象。

1

完全取決於MyObject的作用和process(()的實現方式。作爲一個普遍的概念,如果MyObject是無狀態的,並且一個process調用不會留下任何可能干擾後續調用的剩餘物,那麼您可以優化和使用單個實例,而不是在每次迭代中用新實例抖動垃圾回收器。

+0

@ Mureinik。感謝您的回答。你可以說,你的意思是無國籍。 – Easy2DownVoteHard2Ans

+1

@EasyToDownVoteHardToAns無狀態的意思就是 - 它沒有狀態(即數據成員),並且調用任何方法都不能調用任何後續方法的結果 – Mureinik

+0

@ Mureinik謝謝並注意到。 – Easy2DownVoteHard2Ans

0

在第一個示例中,您將創建obj,直到您的堆大小已滿並且堆大小已滿JVM將引發java.lang.OutOfMemoryError

在第二個示例中,您有一個對象,並且始終調用process()方法。

+3

由於在每次循環迭代之後新創建的對象不再可用,它們將在拋出「OutOfMemoryError」之前被垃圾收集。 – Hoopje