您的代码失败,因为您对尚未释放回内存池中的对象的全局引用过多。全局引用表的最大大小可帮助您捕获内存泄漏并防止程序内存不足。您粘贴的日志消息告诉您这些对象是什么:
java.math.BigInteger。
如果查看您的实现,
native_setup_bystring可以看到您正在创建对新
BigInteger对象的全局引用:
jobject gjobj = env->NewGlobalRef(jobs);
全局引用不会自动垃圾收集[1]
[2],因此您需要显式删除它们,这是在测试中找到的。
方法的问题在于,您正在使用对堆(您的
long mNativeContext字段)中的直接内存引用来存储对内部对象的引用
。这种方法不是一个好方法,因为您要阻止JVM管理BigIntegers的垃圾回收。更好的方法是完全避免使用全局引用,而存储对象引用而不是
long。如果执行此操作,则JVM将能够自动收集要分配的所有对象。



