windingwind / zotero-pdf-translate

Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20+ translate services.
GNU Affero General Public License v3.0
6.06k stars 301 forks source link

[Bug] PDF左侧批注栏开启,插件诱发 macOS 内存泄漏 #736

Closed trarer closed 1 month ago

trarer commented 1 month ago

Is there an existing issue for this?

Have you checked the FAQ (https://github.com/windingwind/zotero-pdf-translate/issues/6)?

Are you using the latest Zotero and the latest plugin?

Environment

Describe the bug

打开PDF的批注栏,开启插件使用后会引发 macOS 内存泄漏。可能是 Firefox 内核或 Zotero 自身对插件的内存管理问题。由于批注栏的翻译按钮无法关闭,浏览PDF的时候只能不打开批注栏才能避免插件诱发的内存泄漏问题。各位开发者如果无法根治这个问题,能够添加一个控制批注栏翻译功能启用的开关?使得插件可以正常屏幕取词,而不去触碰批注栏。

Debug Output

1709646606328 addons.xpi WARN Checking /Applications/Zotero.app/Contents/Resources/distribution/extensions for addons

[JavaScript Error: "NS_NOINTERFACE: " {file: "resource://gre/modules/ComponentUtils.jsm" line: 90}] createInstance@resource://gre/modules/ComponentUtils.jsm:90:36

1709646606910 addons.xpi WARN Addon with ID undefined already installed, older version will be disabled

[JavaScript Error: "Error: Addon must include an id, version, and type" {file: "resource://gre/modules/addons/XPIProvider.jsm" line: 1710}]

[JavaScript Error: "Error: Addon must include an id, version, and type" {file: "resource://gre/modules/addons/XPIProvider.jsm" line: 1710}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "TypeError: can't access dead object" {file: "jar:file:///Users/jie/Library/Application%20Support/Zotero/Profiles/968olcw4.default/extensions/zoteropdftranslate@euclpts.com.xpi!/chrome/content/scripts/zoteropdftranslate.js" line: 276}]

[JavaScript Error: "event.target.classList is undefined" {file: "resource://zotero/reader/reader.js" line: 28360}]

[JavaScript Error: "TypeError: emptyListMessage is null" {file: "chrome://zotero/content/standalone/standalone.js" line: 820}] ZoteroStandalone</this.updateAddonsPane/<@chrome://zotero/content/standalone/standalone.js:820:7

appName => Zotero, version => 7.0.0-beta.65+b047f3d90, os => macOS 14.3.1, locale => en-US, extensions => Better BibTex for Zotero (6.7.163, extension), Linter for Zotero (1.13.1, extension), Jasminum (1.0.0-14, extension), Translate for Zotero (1.1.0-beta.31, extension)

(3)(+2031555): {better-bibtex} +8521 idle: Tue Mar 05 2024 22:23:58 GMT+0800 (China Standard Time), save-database idle

(3)(+0000001): {better-bibtex} +2 emit: better-bibtex event emit idle {"state":"idle","topic":"save-database"}

(3)(+0004998): {better-bibtex} +4998 idle: Tue Mar 05 2024 22:24:03 GMT+0800 (China Standard Time), save-database active

(3)(+0000002): {better-bibtex} +1 emit: better-bibtex event emit idle {"state":"active","topic":"save-database"}

(3)(+0029413): itemTree.render(). Displaying Item Tree

(3)(+0014728): itemTree.render(). Displaying Item Tree

Anything else?

No response

windingwind commented 1 month ago

感谢反馈。请问是否有可复现的步骤

trarer commented 1 month ago

其实这是老问题了。在 macOS 上打开一个具有 zotero 批注的 PDF 条目,并保持批注侧栏开启。关闭条目后,内存并不会释放。打开的新条目越多,批注越多,关闭后的内存会累积。当始终关闭批注侧栏正常使用,并不会产生内存累积。

很多涉及批注的插件貌似都有这个内存泄漏的问题。我只是觉得批注翻译并不是本插件的核心功能,功能太多反而容易产生很多其他问题。如果下游插件开发者无力解决,希望留出一个开关根据需要阻断某些影响性能的功能,保留核心功能。

windingwind commented 1 month ago

怎么确定是插件导致的问题呢,如果是插件导致的,那肯定可以修

trarer commented 1 month ago

目前,用户只能采用控制变量法来排查。把这个插件关闭或卸载后,正常打开批注侧栏使用不存在这些问题。目前可知,较为热门的插件比如 jasminum 和 Better BibTex for Zotero 功能较为简单不会引起这个问题。zotero-style 功能太繁杂也会引发这个问题,而且其原因可能貌似不仅仅是批注侧栏这么简单,没有深入研究测试。

windingwind commented 1 month ago

为排查问题需要按如下步骤协助:

  1. 启用本插件,关闭其他所有插件,然后完全退出zotero
  2. 打开zotero
  3. 打开菜单栏 - 工具 - 开发者 - run javascript
  4. 输入Zotero.openInViewer('about:memory'),点击run
  5. 回到主窗口,执行你认为会造成内存泄漏的操作
  6. 回到刚才打开的内存检查页面,依次点击GC,minimize menory,和measure and save
image
  1. 将保存的文件在此分享链接

谢谢

trarer commented 1 month ago

memory-report.json.gz

trarer commented 1 month ago

内存溢出操作: 1)关闭其他所有插件并重启软件,保持左侧批注栏常开; 2)打开有多条批注的pdf条目然后关闭; 3)重复多个不同pdf条目,观察到活动监视器中的内存不断攀升,维持好几个GB内存占用长期不减。

内存正常操作: 1)关闭其他所有插件并重启软件,保持左侧批注栏常闭; 2)打开有多条批注的pdf条目然后关闭; 3)重复多个不同pdf条目,观察到活动监视器中的内存攀升后回落,维持1GB左右内存占用。

windingwind commented 1 month ago

感谢提供反馈,应已在1.1.0-beta.33修复

trarer commented 1 month ago

感谢提供反馈,应已在1.1.0-beta.33修复

感谢修复。作者可否告知内存泄漏的根源是什么?被困扰了很久!

windingwind commented 1 month ago

z6版本的情况不清楚,z7以后的问题应该来源于侧边栏批注按钮元素

ramonmi commented 1 month ago

感谢提供反馈,应已在1.1.0-beta.33修复 请问新版本加上在zotero7的侧边栏了吗?