ByteBuffer.wrap(byte[]) 会导致长时间运行的应用程序内存泄漏吗?
Posted
技术标签:
【中文标题】ByteBuffer.wrap(byte[]) 会导致长时间运行的应用程序内存泄漏吗?【英文标题】:Will ByteBuffer.wrap(byte[]) cause memory leak for long-running applications? 【发布时间】:2015-08-26 19:38:55 【问题描述】:我尝试在线搜索,但没有找到答案。
基于java doc,ByteBuffer.wrap() 在每次调用中创建一个新的ByteBuffer。在长时间运行的应用程序中,如果没有触发 gc,但应用程序一直在调用 ByteBuffer.wrap(),则应用程序可能会使用更多的 Java 堆外内存,并导致潜在的内存泄漏。对吗?
public static ByteBuffer wrap(byte[] array)
Wraps a byte array into a buffer.
The new buffer will be backed by the given byte array; that is, modifications
to the buffer will cause the array to be modified and vice versa. The new
buffer's capacity and limit will be array.length, its position will be zero,
and its mark will be undefined. Its backing array will be the given array, and
its array offset will be zero.
根据 jdk 代码,答案似乎是否定的,因为 ByteBuffer.wrap() 创建了一个新的 HeapByteBuffer 对象,但没有在下面分配一个新的缓冲区。
public static ByteBuffer wrap(byte[] array,
int offset, int length)
try
return new HeapByteBuffer(array, offset, length);
catch (IllegalArgumentException x)
throw new IndexOutOfBoundsException();
【问题讨论】:
拜托,你能发布你的源代码吗? 我不明白你的担忧。如果您创建的许多引用永久增长,那么您当然会耗尽内存。否则,如果引用在某个时候被丢弃,则不会发生内存泄漏。 我在使用 ByteBuffer 发送 websockets 消息时也遇到过这个问题。问题是即使引用被丢弃,最终内存也会变满。 @yuyang:你找到解决办法了吗? @AndreiF 我还没有找到解决方案。我提出了一个解决方法,每天重新启动进程,以减少内存泄漏的副作用。 【参考方案1】:如果您保留数组的硬引用或包装 ByteBuffers,这只是一个问题。
“wrap”方法不像直接的 ByteBuffer 那样在堆外分配内存。垃圾收集器应该能够在 OutOfMemory 错误发生之前对其进行清理。
【讨论】:
以上是关于ByteBuffer.wrap(byte[]) 会导致长时间运行的应用程序内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章
glTexImage2D 中的 ByteBuffer.wrap() 导致过多的垃圾收集