1. 描述
在使用報表的程式中有時候會遇到記憶體上限溢位的問題,下面簡單介紹我們報表的記憶體機制以及怎樣釋放記憶體。
2. 記憶體機制
2.1 Java 記憶體回收機制
Java 的記憶體垃圾回收(GC)機制是從程式的主要運作物件開始檢查引用鏈,當遍歷一遍後發現沒有被引用的孤立物件就作為垃圾回收。GC 為了能夠正確釋放物件,必須監視每一個物件的運作狀態。包括物件的申請、引用、被引用、指派等,GC都需要進行監視。
在 Java 中,這些無用的物件都由 GC 負責回收,同時 Java 提供了函式可以存取 GC, 如運作 GC 的函式 System.gc(),但是根據 Java 語言規範定義,該函式不保證 JVM 的垃圾收集器一定會執行。因為不同的 JVM 實現者可能使用不同的算法管理 GC。通常 GC 的執行緒的優先別較低。JVM 呼叫 GC 的策略也有很多種,有的是記憶體使用到達一定程度時,GC 才開始工作,也有定時執行的,有的是平緩執行 GC,有的是中斷式執行 GC。
導致記憶體泄漏主要的原因是,先前申請了記憶體空間而忘記了釋放。如果程式中存在對無用物件的引用,那麼這些物件就會駐留記憶體,消耗記憶體,因為無法讓垃圾回收器 GC 驗證這些物件是否不再需要。如果存在物件的引用,這個物件就被定義為"有效的活動",同時不會被釋放。要確定物件所佔記憶體將被回收,我們就要務必確認該物件不再會被使用。
2.2 FineReport 中記憶體管理釋放機制說明
FineReport 報表後台採用的是純 Java 語言編寫,因此其記憶體釋放機制與上述保持一致,當用戶端與伺服器端交互結束(如關閉瀏覽器頁面,列印結束等),伺服器端會將之前用戶端操作消耗的記憶體釋放掉,即置為可被回收狀態,等候 JVM 呼叫 GC
3. FineReport 中的手動 GC 方法
FineReport 在 1G 記憶體下的臨界點應該在 130w 行 *5 列左右,對於某些整合環境來說, 有可能是需要做某些操作後,將FR佔用的記憶體釋放掉,FR裏面也提供了回應的API,具體使用方法如下所示:
在一個範本中新增一個按鈕,給按鈕加上點選事件,或者直接在 JS 中呼叫,內容如下:
關鍵字:GC