我有一个Java类,具有使用C ++实现的本机函数,称为nz.ac.unitec.BigInteger。的本机实现nz.ac.unitec.BigInteger很简单,只是包裹java.math.BigInteger,并调用它的构造函数和add,subtract,multiply...功能。一个字段mNativeContext中nz.ac.unitec.BigInteger用于存储的全局引用一个java.math.BigInteger对象。该对象具有终结器,该终结器应该在垃圾回收对象时销毁全局引用,因此我不会泄漏全局引用。
当我运行一个简单的测试循环以创建多个nz.ac.unitec.BigInteger对象而不显式释放所创建的对象时,在日志(LOG1)之后报告了JNI错误。但是,如果我在离开测试功能之前显式释放创建的对象,则压力测试可以成功执行。
当我有终结器要在垃圾回收对象中删除它们时,为什么JVM的全局引用用完了?
LOG1:
F/art (10730): art/runtime/indirect_reference_table.cc:113] JNI ERROR (app bug): global reference table overflow (max=51200)
F/art (10730): art/runtime/indirect_reference_table.cc:113] global reference table dump:
F/art (10730): art/runtime/indirect_reference_table.cc:113] Last 10 entries (of 51200):
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51199: 0x12e88790 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51198: 0x12e85490 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51197: 0x12e81790 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51196: 0x12e7e760 java.math.BigInteger
F/art (10730): art/runtime/indirect_reference_table.cc:113] 51195: …Run Code Online (Sandbox Code Playgroud)