rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.37k stars 551 forks source link

内存泄漏 #28

Closed stackia closed 9 years ago

stackia commented 9 years ago

在 Instruments 里监视了一下,发现多处内存泄漏: screen shot 2014-10-27 at 6 37 09 pm 每一处具体的调用栈 Instruments 也指出了。 我使用的是develop分支编译出的最新版。

stackia commented 9 years ago

qq20141027-1 2x 还有 Rime 每创建一个 session 都会有些资源重复加载,图上显示的 Rime 在每个 session 都让 opencc load/parse 了一次词典,并且 session destroy 之后资源不会释放。

今天发现 XIME 使用一天后内存占用达到了400多MB,发现问题主要在这个地方。上面提到的内存泄漏影响还不是很大。

lotem commented 9 years ago

@BYVoid 有些可能發生在 OpenCC 代碼裏,大家都來分析一下。

我的印象是鼠鬚管在重新部署之後內存佔用會迅速攀升。平時打打字內存佔用的變化倒不太明顯。

lotem commented 9 years ago

Oh,原來下面那張圖是說資源重複加載的。@BYVoid 失敬。

BYVoid commented 9 years ago

我已經用valgrind檢查過OpenCC了,你也可以試試。

lotem commented 9 years ago

I guess this issue has been resolved by this commit https://github.com/stackia/XIME/commit/952ca18660a7673462d2ddcc2755366db4331681

osfans commented 9 years ago

@lotem trime現在也遇到內存問題: 每次部署和維護時,會多佔用幾十M,字典越多,用的越多。這都400M了。有沒有API可以回收利用啊?

** MEMINFO in pid 12459 [com.osfans.trime] **
                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap   390855   390788        0        0   386297   386297    25350
  Dalvik Heap     2235     2200        0        0     5447     1427     4020
 Dalvik Other      336      336        0        0                           
        Stack      136      136        0        0                           
    Other dev     3160     2912        4        0                           
     .so mmap     3268      396     2372      472                           
    .apk mmap       44        0        0        0                           
    .ttf mmap        1        0        0        0                           
    .dex mmap      180        0      176        0                           
    code mmap     1197        0      452        0                           
   image mmap     5264      668     4172        0                           
   Other mmap      210        4       88        0                           
      Unknown      156      156        0        0                           
        TOTAL   407042   397596     7264      472   391744   387724    29370

RimeFinalizeRimeCleanupAllSessions作用不明顯啊

osfans commented 9 years ago

又試驗了下:同步功能,內存可以回收;維護和部署功能,都回收不了。是因爲多線程?

lotem commented 9 years ago

有趣的發現 Mac 版也是這樣 部署完顯示進程的內存佔用很高

osfans commented 9 years ago

目前的解法是部署和維護之後,讓java程序退出,回收所有內存。 還有一個發現,可能跟這個也有關係。

RimeSetNotificationHandler設定的回調函數,set_option等操作session_id>0,可以正常調回java。部署操作session_id=0,調不回java。猜測此時librime與java通信中斷,librime的內存就再也無法回收了。