【故障处理】VisualVM工具排查内存OOM问题

项目中使用的docker容器启动,里面添加了java程序启动的配置参数

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/docker/dump/heapdump.bin

因为线上文件很大通常我们需要使用gzip压缩下

 gzip -c heapdump.bin >heapdump.bin.gz

那么来正题,我们将对应的文件下载到本地来通过图形化界面VisualVM分析

window命令行启动 win+R 输入jvisualvm 关键字就会启动VisualVM工具

因为对象内存大会导致出现visualvm查看器内存不足

所以这里找到我们jdk安装路径找到对应的目录

$JAVA_HOME/lib/visualvm/etc/visualvm.conf

 找到这个key  关键字visualvm_default_option 把256m改为2048m,然后重启jvisualVM即可。

 打开后通过选择文件-》装入  选择对应的文件加载

在打开的概要选项卡这里我们看到这个关键信息,我们点击进去看下

 

 往下看一直看到有我们自己项目中的包,提取到自己看到的关键信息

根据上面我们对应项目的代码很快就可以定位到问题 点击进去一直跟下去找到那个对象

 

 

 就这样跟着调用的方法就到了这里,JasperFillManager.fillReport 调用第三方插件的方法。

点击类选项卡,可以看到对应实例占用堆内存的大小

点击右键选择在实例视图中显示

点击左边实例可以获取对应属性

点击在类视图中显示,可以看到对应的类图信息

JasperFillManager.fillReport方法出现oom问题怎么解决呢

JasperFillManager.fillReport 方法用于填充 JasperReports 报表模板并生成 JasperPrint 对象。如果在调用 fillReport 方法时遇到 OutOfMemoryError(OOM)异常,这通常意味着 JVM 内存不足以容纳报表数据。解决此问题的方法包括:

1. 增加 JVM 堆内存大小,以便 JVM 能够容纳更多的报表数据。

可以通过修改启动脚本或通过命令行参数来实现。

export JAVA_OPTS="-Xmx4g"

2. 优化报表模板和查询语句,以减少生成的报表数据量

例如,可以尝试使用更简单的查询语句,减少报表中的数据列或行,减少样式、图片等元素的使用等。

3. 分页查询和生成报表,以便将大量数据分成多个小块处理,从而减少内存使用。

4. 使用 JasperReports Server 等报表服务器来处理大量数据,并避免将整个报表加载到内存中。

例如,可以使用 JasperReports Server 来生成报表,并使用 JasperReports 的远程输出功能将报表输出到客户端。

5. 在生成报表时使用低内存模式,这可以通过设置 JasperReports 的虚拟机选项来实现。在低内存模式下,JasperReports 将尽可能缩小内存使用。

例如,可以使用以下虚拟机选项来启用低内存模式:

-Dnet.sf.jasperreports.awt.ignore.missing.font=true -Dnet.sf.jasperreports.default.font.name=SansSerif -Djava.awt.headless=true

请注意,这些解决方案的适用性取决于具体情况,需要根据实际情况进行调整。

猜你喜欢

转载自blog.csdn.net/run_boy_2022/article/details/131050453