历史版本3 :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方法编辑

FR在1G内存下的临界点应该在130w行*5列左右, 对于某些集成环境来说, 有可能是需要做某些操作后, 将FR占用的内存释放掉, FR里面也提供了响应的接口, 具体使用方法如下所示:
在一个模板中添加一个按钮, 给按钮加上点击事件, 或者直接在js中调用, 内容如下:
$.ajax({        url : FR.servletURL,        data : {             op : 'fr_utils',            cmd : 'gs_gc'             },        async : false,   })