私のAndroidアプリケーションでは、私は得ています
E/dalvikvm: HeapWorker がウェッジされています: Lorg/keplerproject/luajava/LuaObject;.finalize()V 内で 10629 ミリ秒 (通常は 10 秒以上) が費やされました
答えを探して、主にガベージコレクターに関する情報を見つけました。その後、コードからすべてのフィニライザーを削除しました。役に立ちませんでした。sqlite 操作をトランザクションに移動しても無駄でした。
状況は次のとおりです。
値を使用していくつかのアクションを実行するために反復する LuaTable があります。
local myTable = getTable() -- function that returns table of values
for i,v in ipairs(myTable) do
someFunction(v)
end
テーブルが大きい (ほぼ 1000 の値)。値に対するアクションは次のとおりです。
- 値情報に基づいて Java オブジェクトを作成する
- Java オブジェクトの作成中にデータベースを照会します (結果 - カーソル内)。
スクリプトを実行するためのホール時間がかなり長くなることが判明しました (関数 LuaState.pcall を介してスクリプトを実行します)。したがって、私の調査により、次の結果が得られました。-しかし、スクリプトはまだ実行中であるため、LuaState オブジェクトがロックされているようです ( Mast3rPlan、コメントありがとうございます!)。そして、確実に10秒以上ロックされます(処理する値がほぼ1000あるため)。そして、この間ずっと、finilize の同期ブロックに入ることができません。そのため、アプリケーションがクラッシュします。同期ブロックの中かっこを削除しても意味がないことに注意してください。このような場合、LunRef メソッドはロックされます ( finalize メソッドを参照)。
LuaJava APIに問題がありますか? または、スクリプトを実行し、ファイナライズに問題がない別の方法がありますか?
助けてくれてありがとう!