FineReport 記憶體機制

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 中呼叫,內容如下:

$.ajax({
     url : FR.servletURL,
     data : {
          op : 'fr_utils',
         cmd : 'gs_gc'
          },
     async : false,
})

關鍵字:GC

附件列表


主題: 效能優化
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

9s后關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙

反饋已提交

網絡繁忙