性能优化之java EE内存管理解决方案
1. 了解现有系统基本情况
1.1. 查看系统现有硬件资源情况
通过在AIX系统内执行相关命令(prtconf),了解现有AIX硬件系统各个方面信息。
在redhat系统内执行相关命令{ dmesg },交接Radhat硬件系统各方面信息。
1.2. 查看数据库版本、参数等情况
通过在Oracle的SQL环境中执行相关命令(SHOWPARAMETER)、查看部分数据库视图,获取数据库相关配置、等信息。
1.3. 通过AWR获取近期数据库运行情况统计信息
在数据库端,通过相关脚本(awrrpt.sql),提取部分AWR 统计报告。
1.4. 获取现有系统运行高峰、压力等信息
通过数据库和应用使用CPU和内存等方面信息,确定目前系统压力高峰时点。
或许一到两周持续时间高峰时段数据库和应用系统CPU和内存压力,存储I/O 繁忙程度。
常用脚本:
内存监控脚本:free -k -s2 -c1800 > log/free_`hostname`_`date +%Y%m%d%H%M%S`.log
CPU监控脚本:sar -u 2 1800 > log/sar_`hostname`_`date +%Y%m%d%H%M%S`.log
注:如果Sar命令需要安装sysstat 包。
1.5. 初步确定优化目标
通过分析、核对,从数据库、weblgoic中间件、jvm参数调整、核心业务系统关键代码优化等方面将整体压力尽快减小。
2. 确定实施具体优化步骤
2.1. 数据库层修改
通过TOPSQL查看查看是否存在不良SQL需要优化。
针对数据量超大的表与DBA和信息部一起讨论针对数据情况、业务特点商讨分区表(或历史数据迁移出去等方式)实施的必要性、可行性等方面问题。
2.2. Weblgoic中间件层修改
检查weblgoic发布补丁集,查看是否有针对现有内存问题的补丁;
通过监控weblgoic的线程池和Jdbc连接池,确定weblogic域瓶颈。
2.3. JVM层修改
在weblgoic启动参数中增加生成dump文件配置;
对内存持续增长服务器手动连续生成dump文件分析堆栈信息;
调整jvm参数如:堆内存设置、64位jdk指针压缩设置、启动JIT设置等。
2.4. 核心业务系统层修改
通过jprofiler、jrm?c、jvisualv?m、Jconsole监控系统瓶颈点,优化瓶颈点代码;
通过jprofiler、jrm?c?监控大量占用内存对象,清理未释放资源代码。
3. 监测优化结果
对部分可立即查看效果的先放置到测试环境进行监测,确定是否有必要恢复。
持续监测一段时间如果未发现内存持续增长和宕机情况出现则可认为内存问题解决。
4. 应用系统维护、优化建议概述
4.1. 定期监控
定期监控数据库和核心业务系统压力情况,并综合分析是否是在合理范围值内。
4.2. 新功能、新需求评估
日后的新功能、新需求,要结合现有数据库结构、业务特点,仔细考核。如客户提出容易对系统造成巨大压力和风险的需求,需详细评估风险、必要性、可行性。
4.3. 大数据表处理
目前数据库中存在个别千万记录级别表。从长期数据量成长角度考虑,可以考虑分区表或历史数据迁出实施的必要性、可行性等方面问题。