AutoJs6 icon indicating copy to clipboard operation
AutoJs6 copied to clipboard

执行脚本时 JS引擎的内存占用问题

Open allen2peace opened this issue 6 months ago • 2 comments

发现执行多个任务后,App占用内存一直在上升,所以想问一下:

是否有方式可以在一个脚本执行完成后、清空 JS引擎的内存占用? 在下一个脚本执行的时候,再重新给 JS引擎初始化?

allen2peace avatar May 28 '25 07:05 allen2peace

同问,楼主解决了吗

5yurong avatar Jun 30 '25 05:06 5yurong

Rhino 脚本引擎本身是纯 Java 对象, 结束脚本只有在所有强引用断开且 GC 触发后才会真正回收. AutoJs6 在 ScriptRuntime 里保存了引擎对象本身 ScriptEngine, 全局作用域 Scriptable scope, 线程, Timer, Handler 等, 其中任意一个没被释放, 整条对象链都会留在堆里. 例如某些静态变量存放了 ContextScriptable, 导致整棵对象树都被留存而无法回收, 再如有些 Context 不恰当使用 Activity 而非 ApplicationContext 上下文等.

AutoJs6 项目是庞大的, 一些隐蔽的或是被忽略的问题, 可能恰恰是导致所有对象无法完美被回收的原因.

目前能做的, 也只能是等待项目开发者及合作者自行检查发现并解决这些问题 (如利用 Android Studio / IntelliJ IDEA 的 Memory Profiler 或 LeakCanary 等). 而脚本开发者, 可以尝试在中在合适的位置显式调用 exit();, 以使脚本线程与定时器尽量全部退出.

SuperMonster003 avatar Jul 29 '25 09:07 SuperMonster003