2010-11-15 91 views
0

我在Mac OS X上的基於Cocoa的應用程序中使用垃圾收集器。它有100個線程正在運行,並且使用Operation Queue完成了同步。活物是垃圾收集?

長時間運行後,其中一個對象被垃圾回收,應用程序將崩潰。

檢查對象是否爲非零也失敗,因爲該對象無效並且包含一些垃圾值。在對象上調用方法會導致崩潰。

任何人都請幫助我調試問題。

謝謝......................

+0

我不知道像這樣的任何特定問題。你能提供更多的信息嗎?也許試圖縮小一些問題的範圍?發佈您懷疑導致問題的任何代碼? – luqui 2010-11-15 07:32:23

回答

2

我使用的垃圾收集器在我的Mac OS X上 可可基礎的應用 它有100個正在運行的線程,並且使用 操作隊列完成同步。

更可能的是,這個錯誤在於代碼的表面上看起來相當併發的性質。在一臺只有兩位數內核的機器上運行100個線程(如果有的話)不可能是非常有效的,當然,保持一切正常同步將是相當困難的。

最好的開始是打開Malloc堆棧日誌記錄並使用malloc_history來查找在南部地址發生的事件。

另外,10.6.5中的修復影響了GC的正確性。

0

如果你可以改變垃圾回收對象的代碼,然後重寫這樣的finalize方法,得到一些信息:

- (void) finalize 
{ 
    NSLog(@"Finalizing!\n%@", [[NSThread callStackSymbols] componentsJoinedByString:@"\n"]); 
    //if you put here a breakpoint, you can check the supposed references to this object 
    [super finalize]; 
} 
+0

建議很好,但您是否看到標有「Objective-C」的標籤以及沒有標有「Java」的標籤? – JeremyP 2010-11-15 09:49:43

+0

我將代碼更改爲Objective-C中的代碼。 – 2010-11-15 15:02:55

+0

@Peter Hosey:我修正了沒有發送'[super finalize]'的錯誤。 – JeremyP 2010-11-15 17:27:04