【发布时间】:2010-10-26 08:12:38
【问题描述】:
我正在寻找应用程序中的内存错误,它似乎与 ServerSocketChannel.accept() 生成的 byte[] 缓冲区有关。根据 jvisualvm,在应用程序使用的 505 megs 中,超过 90% 的内存被 byte[] 数组使用。进一步跟踪,有 68k+ 个 byte[] 实例,到目前为止最常见的大小是 16681。
我对这些字节数组进行了随机抽样,它们无一例外都与 InputRecord 或 OutputRecord 相关。如果我遵循所有引用,我找不到任何不返回终结器的内容,在我有限的理解中,这意味着该对象已准备好进行垃圾收集,但由于某种原因它还没有.
我希望我可以附上 jvisualvm 输出的屏幕截图。无论如何,所指对象包括:
- 输入记录
- AppInputStream
- SSLSocketImpl
- SocketInputStream
- SocksSocketImpl
- SocketOutputStream
- AppOutputStream
- DelegateHttpsURLConnection
- HttpsURLConnectionImpl
这似乎只发生在使用 Apple 虚拟机的客户身上。有人知道为什么这些缓冲区没有被垃圾收集吗?我读错了堆配置文件吗?黑客或变通方法?
【问题讨论】:
-
我假设您在这些或相关对象上调用了 close() ?如果你在 VisualVM 中要求 GC,它是否减少了内存消耗?
-
有类似的问题。此处描述:stackoverflow.com/questions/14610567/…
标签: java macos sockets memory-leaks