2012-03-06 196 views
1

存在以下問題:我正在創建一個編輯器,其中EditorInput包含相當大的對象。創建幾個這樣的編輯器後,我有OutOfMemoryError。堆內存分析器顯示,有3個類型爲EditorHistoryItem的對象,大約佔堆空間的80.8%。 (我想,我甚至關閉了以前的編輯,但他們仍然在記憶中)。Eclipse-RCP禁用導航歷史創建

我想,那些EditorHistoryItems-s與eclipse中的導航歷史建構有關。那麼,我可以禁用導航歷史嗎?或者什麼是其他正確的方式來處理大EditorInput或EditorPart,而不關閉編輯器?

任何意見將不勝感激。

回答

0

好吧,讓你的對象更小。我很確定它不需要加載幾兆字節的對象。當打開一個編輯器並基於用戶交互(激活編輯器部分,幾個表格,按下按鈕......)加載/卸載其他對象時,爲什麼不加載一個非常小的對象作爲IEditorInput實現。

如果用戶激活編輯器,更改頁面(使用MultipageEditor時)或其他可以加載或卸載對象以最大限度減少堆的佔用空間的事件,則可以很好地控制獲取通知。絕對不需要有一個大的IEditorInput對象。

+0

感謝您的回答!我重構了EditorInput並刪除了大對象。它絕對解決了歷史問題,謝謝。 – 2012-03-08 08:30:54

0

根據您使用的編輯器功能,Eclipse最多可以在內存中存儲IEditorInput的最多5個副本。

儘管這對於1000行Java類的<很有效,但編輯大型文件時內存不足。

看看FileEditorInput的源代碼,看看你是否可以編寫自己的版本來實現IEditorInput界面,該界面可以將大部分文件保留在磁盤上並只讀取部分文件。

最糟糕的情況是,您必須編寫您自己的Eclipse編輯器。

+0

我可能沒有很好地描述過問題 - 我已經有了自己的編輯器,它擴展了EditorPart,因此我有一個EditorInput對象,它實現了IEditorInput。當我的編輯器被打開時,我的EditorInput裏面創建了類型爲EditorHistoryItem的對象。我認爲這是爲了支持編輯之間的導航可能性。但我不需要它,並想禁用這種不將我的EditorInput保留在內存中的可能性。 – 2012-03-06 16:00:48

+0

@Alexander Gavrilov:我明白你在問什麼。但是,除非您想重寫整個Eclipse編輯器類庫,否則您只能操作IEditorInput。 – 2012-03-06 16:34:09