2010-11-15 123 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