记一次性能调优经历
最近项目需要将数据库表的数据生成报文,报文以XML文件形式保存。由于这些数据是全国38个省市数千个指标的数据,因此,数据量并不小。平均每期的数据大概有25万。同时,根据业务需求的要求,需要将每期的数据保存到同一个报文里。
我使用了dom4j库来实现这些功能需求。部分代码如下:
在如上代码中,while循环的是从数据库查询出来的25万条数据。在每一次循环里,首先生成RW节点,然后在RW节点下分别添加ACOut节点、ACIN节点、VV节点及VV2节点,再把对应的数据库数据保存到对应的节点。其中tempContent保存的当前循环内的数据,并用竖线“|”分隔。setSignElement()方法保存了每个循环内的tempContent内容,即随着循环次数的逐渐增加,signElement的值就越来越大。
如上的代码执行后效果并不理想。报文生成结束后使用了将近22分钟。日志如下所示:
通过查看GC日志,发现代码在执行过程中,进行了很多次的Full GC。GC日志如一所示:
后来我使用HPjmeter.jar来查看代码执行过程产生的GC日志,发现垃圾回收时间占用整个代码执行时间的7.571%,Full GC时间占用了1.058%,更严重的是,Full GC占用整个GC时间高达13.97%。HPjmeter.jar分析结果图如下所示:
根据如上的分析结果,大致可以得出结论:由于Full GC的次数太多导致需要花费大量生成报文。
接下来,我使用visualvm工具来查看在报文生成过程当中,JAVA内存的动态使用情况。根据观察的结果,发现年老代内存有大量内存分配并迅速被回收,而此时,年轻代内存却没有明显的分配过程。根据内存的分配策略,可以断定,这是由于代码里生成了大量的大对象,而大对象会直接进入老年代导致这样的结果。知道了原因后,我将代码如下修改(即修改了生成大数据对象的代码),见红色框框部分:
修改完后再次执行代码,日志如下:
这次执行过程所使用时间只用了29秒,提高了45倍多。真是让我无比惊讶啊。
可见,代码的编写质量对应用的性能影响是相当的巨大啊。
最后,再把这两次执行结果贴出来对比一下。
相关推荐
字节码是一种平台无关的中间表示,使得Java具备“一次编写,到处运行”的特性。在运行时,JVM会加载这些字节码文件,进行链接和初始化,最后执行。 2. **JVM内存分代**: 为了优化垃圾回收(GC)效率,JVM将内存...
- **新生代**:主要存放新创建的对象以及经过一次Minor GC后仍然存活的对象。新生代又被进一步划分为Eden区和两个Survivor区(S0和S1)。大多数对象都会在这个区域经历多次垃圾回收后被销毁。 - **老年代**:存放较...
通过在Survivor区内让对象经历多次Minor GC仍然能够存活的情况下,才将其转移到老年代。 - **为何需要Survivor区**:若没有Survivor区,新生代每次执行Minor GC后存活的对象会直接进入老年代,这会导致老年代迅速填...
在这个过程中,他经历了多次技术迭代和个人职业转型,每一次经历都让他对Oracle数据库有了更深的理解。特别是当Oracle版本从5.1升级到7.1时,其便捷的安装配置和显著提升的性能让白鳝感到惊喜,这也成为了他职业生涯...
例如,《5月11日》可能记录了一次数据库性能调优的过程,《5月12日》可能涉及到了数据库备份策略的讨论,《5月13日》可能是关于高可用性架构RAC(Real Application Clusters)的初步接触,《5月14日》和《5月15日》...
- **案例一:**某大型电商平台采用MySQL作为核心数据库,在经历多次双11高峰后总结出的一套完整的性能调优方案。 - **案例二:**社交应用通过引入分区表技术和读写分离策略,成功应对用户数量激增带来的挑战。 - **...
- **《macrozeng:第一次DB2调优》**: 介绍了作者第一次尝试优化DB2数据库性能的经历和所获得的经验教训。 - **《leo:我与她(DB2)》**: 描述了作者与DB2之间的深厚情感以及如何通过DB2解决实际工作中的问题。 ...
《KylinPET v2.6 for Windows:国产性能测试工具详解》 KylinPET,全称为Kylin Performance Evaluation Tool,是一款由...无论是开发团队进行性能调优,还是运维人员监控系统健康状态,KylinPET都是值得信赖的选择。
- **Eden区与Survivor区**:新生代内存分为Eden区和两个Survivor区,大多数对象在Eden区创建,经历第一次 Minor GC 后,存活的对象会被移到Survivor区。 - **对象晋升**:当对象在Survivor区经历多次GC仍存活,会...
1. **数据库重演(Database Replay)**:这是一个性能调优工具,允许管理员记录生产环境中的工作负载,然后在测试环境中重现这些工作负载,以便评估和优化系统性能。 2. **SQL重演(SQL Replay)**:与数据库重演类似,...
这包括但不限于数据库的设计与优化、权限管理、性能调优、故障排查、备份与恢复策略的制定以及日志监控等任务。 ASE125还提供了一些示例数据库,如pubs2和pubs3,这些数据库模拟了一个虚构的图书销售公司的业务场景...
《UnityPacker:掌握游戏资源打包利器》 UnityPacker-master.rar 是一个包含Unity游戏资源打包工具源码的压缩文件,对于Unity开发者来说,...无论是对于初学者还是经验丰富的开发者,这都是一次宝贵的探索和学习经历。
9. **性能调优**:通过分析执行计划、使用绑定变量、避免全表扫描、合理使用索引以及优化SQL语句,提升PL/SQL程序的运行效率。 10. **错误处理和日志记录**:良好的错误处理机制可以保证程序的健壮性。PL/SQL提供了...
EaseBase数据库平台接口服务是专为开发者和运维人员设计的一款高效、稳定且易用的数据...在实际工作中,结合运维背景,还需要掌握数据库性能调优、故障排查和高可用架构等相关知识,以确保数据库接口服务的稳定运行。
JVM的概念源于Java平台,它的设计目标是实现跨平台的“一次编写,到处运行”。自1995年Java诞生以来,JVM经历了多个版本的演进,不断优化性能,提高效率,支持更多的特性。 ## 二、JVM运行机制 1. **启动流程**:...
- **老年代**:经历过多次GC仍存活的对象会被移到老年代。 3. **对象创建与内存分配** - 使用`new`关键字创建对象时,对象实例通常在堆中分配,引用在栈中存储。 4. **垃圾收集的判定方法** - **引用计数法**:...
MySQL的配置对于性能调优至关重要,包括设置系统变量、调整缓存大小、控制连接数量等。系统变量通过***f或my.ini配置文件设置,而性能优化则可能涉及到修改诸如thread_cache_size、key_buffer_size、innodb_buffer_...
大部分对象在Eden区中生成,经过第一次垃圾收集后,存活的对象会被移动到Survivor区,反复经历这个过程,直到达到一定的年龄阈值,再晋升到老年代。 3. **老年代(Tenured Generation/Old Generation)** 老年代...