3

我正在尝试用 Java 构建一个 SIP 客户端。作为 SIP 框架,我使用 doubango。为了显示我通过 JOGL 使用 OpenGL 的视频,但这并不重要,因为在测试期间我实际上将 ByteStream 与 JOGL 分离。

首先,该视频在带有 32 位 VM 的 Win 7 上运行良好。这些库不能为 64 位编译,所以我必须在 64 位系统上使用 32 位 VM,我认为它应该可以正常工作。不幸的是,我只能看到视频几秒钟,然后它就崩溃了,出现“javaw.exe 中 0x774315de 处的未处理异常:0xC0000005:访问冲突读取位置 0xdddddde9”。

VisualStudio 中的调试显示,异常发生在以下行:

memcpy((void*)m_ConsumeBuffer.pConsumeBufferPtr, pBuffer, nRetsize);

http://code.google.com/p/doubango/source/browse/branches/2.0/doubango/bindings/_common/ProxyConsumer.cxx#710

所以显然错误发生在数百次调用该方法后(因为视频正确显示了一段时间)。

为了缩小可能的原因,我只在测试中实现了传入视频。

doubango 从我的 Java 实现中获取指向 ByteBuffer 的指针,如下所示:

videoFrame = ByteBuffer.allocateDirect(frameSize);
consumer.setConsumeBuffer(videoFrame, frameSize);

这是我在施工时从它那里得到consumer的 doubango 自己的。ProxyVideoConsumer

我对 C++ 调试不太熟悉,因为我对 Java 和 Delphi 更有经验,但我认为我有信心说似乎发生了某种堆损坏。

我目前的假设是 JVM 的ByteBuffer.allocateDirect(..)-function 在 64 位机器上运行 32 位 JVM 时表现不正确,但我当然可能会弄错。

有趣的是,在大约 50 次测试中的两次,视频稳定了 5-10 分钟,没有任何降级或明显的内存泄漏。但是这种“伪随机性”与我在 Delphi 中处理内存分配问题的经验是一致的。

如果有人可以帮助我,我会很高兴,因为我已经没有办法让它稳定运行了。

问候, CSP

4

1 回答 1

0

我想我自己解决了这个问题。显然,当错误发生时,此时pBuffer已经释放/无效。到目前为止,我跟踪了错误,sipSessionJVM 以随机间隔释放包含缓冲区的 JVM,即使 JVM 中仍然存在引用。

将垃圾收集器置于调试模式也没有透露太多信息,因为此时它没有记录任何处置任何对象的意图。实际上,错误仅在几秒钟后发生,因此 GC 那时并没有尝试释放任何东西。

我发现了一个实例,我sipSession过早地释放了错误,这降低了错误的频率,但所有其他处置都有导致 GC 的堆栈跟踪。

于 2013-05-06T08:25:54.420 回答