为什么80%的码农都做不了架构师?>>>   

数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OOM。怀疑是处理feed内存峰值消耗过大导致频繁Full GC。如下图:

分析过程

服务每15分钟会从Feed Server下载36个数据文件,包括12个17M,12个18M和12个100多M的文件。数据格式为JSON。由于服务是一次性加载整个JSON文件,然后转换成java对象。这个地方内存消耗可能会比较大,通过下面一组测试可以发现一些情况:

测试准备:

  • 1个16M的JSON数据文件和1个100M的JSON数据文件。
  • jackson2.3.4.Final (JSON 解析库)
  • jdk1.6.0u30

测试方法:

  • 通过Document Model API 来解析JSON文件,统计处理时间及新增内存大小
  • 通过streaming API来解析JSON文件,统计处理时间及新增内存大小

测试结果:

  • Document Model
  • Streaming API
  • Mem Usage Chart for Document Model (17M JSON file) - 39 Minor GC take 3.024s, 62 Full GC take 5.244s
  • Mem Usage Chart for Streaming API(17M JSON file) - 394 Minor GC take 78ms, 30 Full GC take 557ms

结论:

  • 下载是由5个线程并发下载,假设文件都是100M左右,那么在同一时刻的内存峰值有可能达到330Mx5,大概1.5G。基本上已经占掉了分配给整个进程的1/2。
  • 每次OOM都发生在14分-20分左右,这个时候正是数据收集服务处理数据的时候,单个进程需要处理的设备数量是18万个,如果这个时候再开始下载feed,就一定会出现OOM。

修复和改进

仔细审查feed下载和解析的流程,发现使用的是一次加载整个文件的方式,根据前面表格的数据可以得知这种方式会长期占据内存,而且源文件中有一半的字段是后期不需要的。所以决定采用新方案如下:

  • 减少并发下载feed的线程,由于前的5个改成2个。因为feed的下载和预处理并不是瓶颈,没必要在这开太多线程处理feed而导致处理是内存急剧上升。
  • 采取streaming的方式处理JSON,预先把后面不需要的数据丢弃然后保存剩余数据至缓存共后期数据处理使用。

更改后的内存占用如下图:

对比改进之前的内存分析图(文章首部第一副图),可以看到改进后的总占用量有所下降,而且内存可以快速回收。

转载于:https://my.oschina.net/foxty/blog/383206

Java性能优化:正确的解析JSON文件相关推荐

  1. java解析json文件_Java性能优化:正确的解析JSON文件

    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...

  2. 拉勾教育 | Java 性能优化实战 21 讲

    开篇词 开篇词 | Java 性能优化,是进阶高级架构师的炼金石 你好,我是李国.作为<Java 性能优化与面试 21 讲>这个课程的作者,我先来简单介绍下自己. 我曾任京东金融.陌陌科技 ...

  3. java性能优化权威指南_Java性能优化权威指南 PDF扫描[132MB]

    Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议.主要包括以下几方面:性能监控.性能分析.Java HotSpot VM 调优.高效的基准测试以及Java EE ...

  4. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  5. Java性能优化指南(一)

    2015年在大物流项目中,给项目团队做了几次Java性能优化和问题排查的分享,不过效果都不是很好.一直觉得偏向技术实践类的东西,单纯的听和单纯的讲收获都很有限,最好的做法是阅读学习-理解-实践-总结, ...

  6. java 性能 优化_Java十大简单性能优化

    java 性能 优化 关于" web scale "这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统"规模化". 但是什么是扩 ...

  7. Java 性能优化的七个方向

    了解了优化目标后,那接下来应该从哪些方面入手呢?本文主要侧重于理论分析,我们从整体上看一下 Java 性能优化都有哪些可以遵循的规律.本文主讲理论.关于实践,后续的文章会用较多的案例来细化本文的知识点 ...

  8. 解析json文件、执行批量修改sql

    要求:解析json文件,取出其中的参数,修改数据库中的数据 数据量:190万条 使用线程池批量处理sql 1.线程: public class DateHandleThread extends Thr ...

  9. Java性能优化,操作系统内核性能调优,JYM优化,Tomcat调优

    文章目录 Java性能优化 尽量在合适的场合使用单例 尽量避免随意使用静态变量 尽量避免过多过常地创建Java对象 尽量使用final修饰符 尽量使用局部变量 尽量处理好包装类型和基本类型两者的使用场 ...

最新文章

  1. 《C#精彩实例教程》小组阅读09 -- C#数组与集合
  2. 001帝国Cms二次开发之helloworld
  3. C语言经典算法五个人问岁数!——————【Badboy】
  4. Javascript右键菜单类
  5. 文档视图结构下多视图间的控制
  6. python 操作 elasticsearch-7.0.2 遇到的问题
  7. Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理
  8. python文件按行读取变为嵌套列表_迭代两个嵌套的2D列表,其中list2具有list1的行号...
  9. CS184.1X 计算机图形学导论 第8讲 学习笔记
  10. python中列表、元组、字符串都属于有序序列_列表、元组、字符串是Python的有序序列。...
  11. v8的垃圾回收机制(二)
  12. springboot-mybatis-多数据源
  13. node.js 学习书籍推荐
  14. 玉溪推行电子政务 建设新型智慧城市
  15. java 反射 框架_Java——利用反射实现框架类
  16. 发那科机器人寄存器Ar_浅谈发那科机器人与TP参数之间的关系
  17. PPT背景填充的几种方式,简单高效
  18. 最新官方新浪短网址API接口分享-附代码调用演示
  19. c语言中数组arr的表示含义
  20. 基于机器学习的锂离子电池健康状态预测:进展与展望

热门文章

  1. 一些实用的注册表封装类
  2. 如何完全卸载 mysql 数据库
  3. Java反射详细介绍
  4. 基于Struts2.3.x+Spring3.2.x+Hibernate4.2.x+EasyUI1.3.4+Maven架构的示例程序
  5. 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  6. HDU 1004 Let the Balloon Rise
  7. IT项目管理之系统部署
  8. Mysql关闭和修改密码
  9. DevOps和容器:本地or云端,如何选择?
  10. http://www.fx114.net/qa-24-116329.aspx