我的 android 应用程序需要很多数组。为了防止 GC,我开始使用Javolution.arrayFactory。
但是,如果我alloc
在一个线程中记忆,如下所示。
byte []buffer = ArrayFactory.BYTES_FACTORY.array(size);
并在另一个线程中释放它,如下所示。
ArrayFactory.BYTES_FACTORY.recycle(buffer);
然后它会导致内存泄漏。我需要实现数组池的库或类。
我的 android 应用程序需要很多数组。为了防止 GC,我开始使用Javolution.arrayFactory。
但是,如果我alloc
在一个线程中记忆,如下所示。
byte []buffer = ArrayFactory.BYTES_FACTORY.array(size);
并在另一个线程中释放它,如下所示。
ArrayFactory.BYTES_FACTORY.recycle(buffer);
然后它会导致内存泄漏。我需要实现数组池的库或类。
通常没有分配大量 byte[] 的方法来重用它们,而不是动态地回收它们。
例如,假设您有一个 Socket 处理程序对象,并且它有一个 byte[]。您可以创建一次 byte[] 并在连接的整个生命周期内保留它。
您可以拥有一个 ByteBuffer ,它被拆分到多个位置,以使用相同的字节数组创建多个缓冲区。
或者您可以使用您设计的结构存储数据,例如堆外内存(我怀疑这对 JVM 比对 Android 更有效)
我曾经回收了很多,byte[]
但随着时间的推移,我在不同的项目中找到了用预先分配的或长期存在的缓冲区替换所有这些的方法,这降低了 CPU 开销。