`
seandeng888
  • 浏览: 158522 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

记一次性能调优经历

阅读更多

记一次性能调优经历

最近项目需要将数据库表的数据生成报文,报文以XML文件形式保存。由于这些数据是全国38个省市数千个指标的数据,因此,数据量并不小。平均每期的数据大概有25万。同时,根据业务需求的要求,需要将每期的数据保存到同一个报文里。

    我使用了dom4j库来实现这些功能需求。部分代码如下:

在如上代码中,while循环的是从数据库查询出来的25万条数据。在每一次循环里,首先生成RW节点,然后在RW节点下分别添加ACOut节点、ACIN节点、VV节点及VV2节点,再把对应的数据库数据保存到对应的节点。其中tempContent保存的当前循环内的数据,并用竖线“|”分隔。setSignElement()方法保存了每个循环内的tempContent内容,即随着循环次数的逐渐增加,signElement的值就越来越大。

如上的代码执行后效果并不理想。报文生成结束后使用了将近22分钟。日志如下所示:



 

       通过查看GC日志,发现代码在执行过程中,进行了很多次的Full GCGC日志如一所示:
 

 
     后来我使用HPjmeter.jar来查看代码执行过程产生的GC日志,发现垃圾回收时间占用整个代码执行时间的7.571%Full GC时间占用了1.058%,更严重的是,Full GC占用整个GC时间高达13.97%HPjmeter.jar分析结果图如下所示:


根据如上的分析结果,大致可以得出结论:由于Full GC的次数太多导致需要花费大量生成报文。

    接下来,我使用visualvm工具来查看在报文生成过程当中,JAVA内存的动态使用情况。根据观察的结果,发现年老代内存有大量内存分配并迅速被回收,而此时,年轻代内存却没有明显的分配过程。根据内存的分配策略,可以断定,这是由于代码里生成了大量的大对象,而大对象会直接进入老年代导致这样的结果。知道了原因后,我将代码如下修改(即修改了生成大数据对象的代码),见红色框框部分:



        修改完后再次执行代码,日志如下:


这次执行过程所使用时间只用了29秒,提高了45倍多。真是让我无比惊讶啊。

可见,代码的编写质量对应用的性能影响是相当的巨大啊。

        最后,再把这两次执行结果贴出来对比一下。



 

  • 大小: 70 KB
  • 大小: 19.8 KB
  • 大小: 63.5 KB
  • 大小: 28.7 KB
  • 大小: 80.6 KB
  • 大小: 18.1 KB
  • 大小: 37.2 KB
分享到:
评论

相关推荐

    分享:JVM及其性能调优,欢迎交流

    字节码是一种平台无关的中间表示,使得Java具备“一次编写,到处运行”的特性。在运行时,JVM会加载这些字节码文件,进行链接和初始化,最后执行。 2. **JVM内存分代**: 为了优化垃圾回收(GC)效率,JVM将内存...

    深入浅出jvm虚拟机视频大全(jvm性能调优+内存模型+虚拟机原理)

    - **新生代**:主要存放新创建的对象以及经过一次Minor GC后仍然存活的对象。新生代又被进一步划分为Eden区和两个Survivor区(S0和S1)。大多数对象都会在这个区域经历多次垃圾回收后被销毁。 - **老年代**:存放较...

    jvm 调优建议文档

    通过在Survivor区内让对象经历多次Minor GC仍然能够存活的情况下,才将其转移到老年代。 - **为何需要Survivor区**:若没有Survivor区,新生代每次执行Minor GC后存活的对象会直接进入老年代,这会导致老年代迅速填...

    DBA日记 作者:白鳝

    在这个过程中,他经历了多次技术迭代和个人职业转型,每一次经历都让他对Oracle数据库有了更深的理解。特别是当Oracle版本从5.1升级到7.1时,其便捷的安装配置和显著提升的性能让白鳝感到惊喜,这也成为了他职业生涯...

    DBA日记 第一部份

    例如,《5月11日》可能记录了一次数据库性能调优的过程,《5月12日》可能涉及到了数据库备份策略的讨论,《5月13日》可能是关于高可用性架构RAC(Real Application Clusters)的初步接触,《5月14日》和《5月15日》...

    mysql high performance

    - **案例一:**某大型电商平台采用MySQL作为核心数据库,在经历多次双11高峰后总结出的一套完整的性能调优方案。 - **案例二:**社交应用通过引入分区表技术和读写分离策略,成功应对用户数量激增带来的挑战。 - **...

    《DB2中国》特刊电子杂志

    - **《macrozeng:第一次DB2调优》**: 介绍了作者第一次尝试优化DB2数据库性能的经历和所获得的经验教训。 - **《leo:我与她(DB2)》**: 描述了作者与DB2之间的深厚情感以及如何通过DB2解决实际工作中的问题。 ...

    kylinPETv2.6 for windows

    《KylinPET v2.6 for Windows:国产性能测试工具详解》 KylinPET,全称为Kylin Performance Evaluation Tool,是一款由...无论是开发团队进行性能调优,还是运维人员监控系统健康状态,KylinPET都是值得信赖的选择。

    JVM 内存优化

    - **Eden区与Survivor区**:新生代内存分为Eden区和两个Survivor区,大多数对象在Eden区创建,经历第一次 Minor GC 后,存活的对象会被移到Survivor区。 - **对象晋升**:当对象在Survivor区经历多次GC仍存活,会...

    Oracle11g教程_初识Oracle11g

    1. **数据库重演(Database Replay)**:这是一个性能调优工具,允许管理员记录生产环境中的工作负载,然后在测试环境中重现这些工作负载,以便评估和优化系统性能。 2. **SQL重演(SQL Replay)**:与数据库重演类似,...

    ASE125简介和安装技巧.非常实用的资料

    这包括但不限于数据库的设计与优化、权限管理、性能调优、故障排查、备份与恢复策略的制定以及日志监控等任务。 ASE125还提供了一些示例数据库,如pubs2和pubs3,这些数据库模拟了一个虚构的图书销售公司的业务场景...

    UnityPacker-master.rar

    《UnityPacker:掌握游戏资源打包利器》 UnityPacker-master.rar 是一个包含Unity游戏资源打包工具源码的压缩文件,对于Unity开发者来说,...无论是对于初学者还是经验丰富的开发者,这都是一次宝贵的探索和学习经历。

    Oracle 9i10g PLSQL编程详细

    9. **性能调优**:通过分析执行计划、使用绑定变量、避免全表扫描、合理使用索引以及优化SQL语句,提升PL/SQL程序的运行效率。 10. **错误处理和日志记录**:良好的错误处理机制可以保证程序的健壮性。PL/SQL提供了...

    EaseBase数据库平台接口服务

    EaseBase数据库平台接口服务是专为开发者和运维人员设计的一款高效、稳定且易用的数据...在实际工作中,结合运维背景,还需要掌握数据库性能调优、故障排查和高可用架构等相关知识,以确保数据库接口服务的稳定运行。

    jvm相关总结

    JVM的概念源于Java平台,它的设计目标是实现跨平台的“一次编写,到处运行”。自1995年Java诞生以来,JVM经历了多个版本的演进,不断优化性能,提高效率,支持更多的特性。 ## 二、JVM运行机制 1. **启动流程**:...

    面试官常问的JVM面试题

    - **老年代**:经历过多次GC仍存活的对象会被移到老年代。 3. **对象创建与内存分配** - 使用`new`关键字创建对象时,对象实例通常在堆中分配,引用在栈中存储。 4. **垃圾收集的判定方法** - **引用计数法**:...

    1.MySQL基础篇(1~5).pdf

    MySQL的配置对于性能调优至关重要,包括设置系统变量、调整缓存大小、控制连接数量等。系统变量通过***f或my.ini配置文件设置,而性能优化则可能涉及到修改诸如thread_cache_size、key_buffer_size、innodb_buffer_...

    Java运行内存

    大部分对象在Eden区中生成,经过第一次垃圾收集后,存活的对象会被移动到Survivor区,反复经历这个过程,直到达到一定的年龄阈值,再晋升到老年代。 3. **老年代(Tenured Generation/Old Generation)** 老年代...

Global site tag (gtag.js) - Google Analytics