bi项目oom调优

先简单介绍下项目:数据展示项目,合计有2千张页面,200多人使用,目前部分报表数据量较大,所以sql查询结果出来的也较慢。

jvm内存oom,jvm自己宕掉,怎么确定是oom导致的呢?

oom的几种表现形式:

1)tomcat的catalina.outh中有异常日志,如执行cat catalina.out | grep OutOf,有类似如下结果
22-Apr-2019 11:13:32.149 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:+HeapDumpOnOutOfMemoryError
java.lang.OutOfMemoryError: GC overhead limit exceeded
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded

2)如果catalina.sh配置了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/boss/tomcat8/bin/dump.hprof 那么/home/boss/tomcat8/bin/路径下会有dump文件生成。

3)hs_err_pid21364.log ,有类似内容如下:
#  Out of Memory Error (os_linux.cpp:2627), pid=30394, tid=140082987804416

解决oom的两个方向:

1)调整jvm的参数,首先尝试优化jvm各种参数,相信我,如果你不做任何配置,使用jvm的默认的回收策略,性能真的很差;
一个是合理设置jvm堆中eden、survior、old三个区的大小。
二是制定合理的回收策略,包括回收器、回收参数配置。jvm参数配置可参考:
三 配置dump路径,日志等,有问题便于定位和处理
四 JIT相关参数配置,最大化代码执行速度
https://blog.youkuaiyun.com/h2604396739/article/details/87778753
2)修改代码,减少代码中对象的生成,减少对象对内存的占用。
包括缓存,大的对象等,大的sql查询结果的处理等,可参考,https://blog.youkuaiyun.com/h2604396739/article/details/90600637
如下面的代码一次就声明了2G的空间的字节数组,新生代的eden和survior都放不下,直接放到老年代,会直接消耗很大的内存。
byte b[] = new byte[2*1024*1024*1024];

补充说明:

1)上面两种方案,应该先尝试修改jvm的参数,一般参数修改后就能解决oom的问题,如果还不行就需要修改代码了。

2)上面优化oom,大量减少缓存,导致的结果就是会增大数据库的压力、同时延长单个tomcat请求的占用时间,需要注意mysql压力变化(调整数据库连接池)和tomcat 连接配置(即server.xml中的connector)是否需要优化。或者根据你的系统分析会增加声明别的压力。

服务假死

完成上面的优化后,程序依然会挂掉,而且更频繁,现象:
发生时间:大概重启3小时左右,上午11点,下午2点多,都是系统使用较多的时间。最严重的一天挂了三次
用ps -ef | grep tomcat指令查看,发现tomcat的进程还在,端口也在占用。
但是日志不再打印,并且不再提供任何服务。这种情况其实是tomcat假死。
下面给出程序宕机和重启的时间的日志。
tomcat假死前的最后两条日志:时间-2019-05-28 14:10:19
[INFO]-[2019-05-28 14:10:19]-[info.info():50]-[http-nio-8080-exec-10] Takes:2315 ms [org.cboard.services.DataProviderService.queryAggData(Long,Map,Long,AggConfig,boolean)] 
[INFO]-[2019-05-28 14:10:19]-[info.info():50]-[http-nio-8080-exec-10] Takes:2320 ms [org.cboard.controller.DashboardController.getAggregateData(Long,String,Long,String,Boolean)] 

tomcat重启的最开始两条日志:时间-28-May-2019 14:18:10.173
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
28-May-2019 14:18:10.173 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.31

很懵逼,程序宕掉的时候没有记录任何错误日志。

没办法只能临时kill掉进程 然后重启tomcat。这里给出一个解决该问题的临时方案,linux定时任务脚本监控,发现程序假死时重启,参考脚本:https://blog.youkuaiyun.com/h2604396739/article/details/90736569
然后就需要定位tomcat假死原因了。

下面的博客继续介绍程序假死解决方案:https://blog.youkuaiyun.com/h2604396739/article/details/91375949

### OOM错误的实战案例和技术指导 #### 背景分析 在大数据处理场景下,Kettle(Pentaho Data Integration)是一款常用的ETL工具。然而,在面对海量数据或复杂的转换流程时,可能会遇到`OutOfMemoryError`(简称OOM)问题[^1]。此类问题通常表现为`java.lang.OutOfMemoryError: Java heap space`或`GC overhead limit exceeded`。 以下是针对该问题的具体解决方案: --- #### 解决方案一:JVM内存配置 通过合理设置JVM参数来增加可用内存是一种常见的方法。例如: - **增大堆内存**:可以通过以下参数扩展JVM的最大堆内存容量。 ```bash -Xms2048M -Xmx2048M ``` 这里设置了初始堆内存和最大堆内存均为2GB。根据实际需求可进一步整[^3]。 - **化新生代比例**:适当整新生代与老年代的比例有助于减少垃圾回收的压力。 ```bash -Xmn1024M -XX:SurvivorRatio=6 ``` 上述命令将新生代大小设为1GB,并将其划分为两个幸存区和一个伊甸园区,比例为1:6[^3]。 --- #### 解决方案二:生成并分析内存快照 当发生OOM错误时,可通过启用特定的JVM参数来自动生成内存快照文件(`.hprof`),以便后续分析。 - 启用内存快照功能: ```bash -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumpfile.hprof ``` 此处指定了在发生OOM时自动保存内存状态至指定路径下的`.hprof`文件[^2]。 - 使用工具分析快照文件: 常见工具有MAT (Eclipse Memory Analyzer Tool) 和 VisualVM。这些工具可以帮助识别哪些对象占用了大量内存以及是否存在内存泄漏等问题[^4]。 --- #### 解决方案三:化数据流设计 除了JVM参数外,还需要关注数据流的设计合理性。以下是一些改进建议: - **分页读取数据**:对于大规模数据集,应采用分批加载的方式而非一次性全部载入内存中。这可以显著降低单次操作所需的内存开销[^1]。 ```sql SELECT * FROM large_table LIMIT 1000 OFFSET {offset}; ``` - **避免不必要的缓存**:移除任何可能导致多余数据驻留于内存中的逻辑,比如临时变量或者中间结果存储[^1]。 - **化复杂计算**:重新审视涉及排序、去重的大规模运算部分,考虑引入外部索引结构或其他高效算法替代纯内存内的实现方式。 --- #### 解决方案四:禁用性能监控特性 某些情况下,默认开启的一些性能统计机制会额外消耗系统资源。因此可以选择关闭它们以释放更多可用内存给核心业务进程使用。 - 禁止创建PerfData文件: ```bash -XX:-UsePerfData ``` - 禁用共享内存支持: ```bash -XX:+PerfDisableSharedMem ``` 上述两项措施能够有效削减后台服务带来的负载压力[^5]。 --- ### 总结 通过对JVM参数精细节、利用专业诊断工具深入剖析潜在瓶颈所在之处、改进应用程序内部架构等方面入手,可以较为全面地应对由内存不足引发的各种挑战。最终目标是在保障稳定性的前提下提升整体运行效能。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值