Luajava HeapWorker 在执行大型脚本时出现了卡住的情况。

在我的 Android 应用中,我遇到了以下报错:

E/dalvikvm: HeapWorker is wedged: 10629ms (generally more than 10 sec) spent inside Lorg/keplerproject/luajava/LuaObject;.finalize()V

我搜索了答案,并主要找到了有关垃圾回收器的信息。在此之后,我从我的代码中移除了所有 finilizer。但是这并没有帮助。将 SQLite 操作移动到事务中也没有用处。

目前的情况是:

我有一个 LuaTable,我遍历它以执行某些值的操作:

local myTable = getTable() -- 函数返回值的表
for i,v in ipairs(myTable) do
    someFunction(v)
end

该表很大(近1000个值)。对这些值的操作如下:

  1. 根据值信息创建Java对象
  2. 查询数据库(结果 - Cursor)在Java对象创建过程中

执行脚本的整个时间变得相当长(我通过函数LuaState.pcall运行脚本)。因此,我的研究导致以下结果:

  • 当我处理了约15个值(1000个)时,'finalize'方法被调用;
  • 但是脚本仍在执行,所以 LuaState 对象似乎被锁定(Mast3rPlan,谢谢你的评论!)。而且它肯定会被锁定超过10秒钟(因为有近1000个值要处理)。而在这段时间中,无法进入 finilize 的同步块。因此,应用程序崩溃了。 请注意,即使删除同步块的括号也没有用。在这种情况下,LunRef 方法会被锁定(请参阅 finalize 方法)。

这是 LuaJava API 的问题吗?还是还有其他方法可以执行脚本,并避免出现finalize的问题?

提前感谢您的帮助!

点赞