这可能是fastjson的一个bug,我使用最新版依然存在该问题。

  在用做报表功能的时候,发现一旦单元格过多,大概有80-100个单元格,就会发生程序假死,CPU持续占用超过90%,内存持续占用超90%的情况,主要是报表页面无法生成,这已经对我的业务产生了影响,不得不解决这个问题。

  查看之前的代码逻辑,发现原来的处理方式是直接用

  
JSONObject.toJSON(object) 来处理Javabean的,这样处理简单的对象是没有问题的,但是对象如果复杂的话就会发生一些问题。
object对象过于复杂和大量时,用toJSOn解析就会出现CPU、内存一直飙升,JVM一直执行GC操作,但是无法回收内存,最后会报
java.lang.OutOfMemoryError: GC overhead limit exceeded 错误。


  看到这里,我觉得这个内存泄漏问题我是不是可以直接修改JVM参数来扩大一下堆内存,设置后重新尝试了一下,结果是一样的,没有效果。也从网上搜索到了说设置-XX:-UseGCOverheadLimit参数可以解决,试了也无果。然后就开始用mat分析一下我该段程序的dump文件,发现了一个地方有问题,也和控制台最终报的错是同样的异常:

  com.alibaba.fastjson.util.IdentityHashMap产生了大量org.springframework.core.ResolvableType

  这是因为IdentityHashMap 使用 System.identityHashCode作为key,而没有使用 ResolvableType的hash值

  这种情况主要的出现场景就是json解析的时候采用了泛型,泛型类没有直接指定具体类型。

  问题已经找到了,该解决了。我的解决方式是换成jackson解析,至于改fastjson源码我没有去试。

  我的解决方式:
ObjectMapper mapper = new ObjectMapper();
//这里的JSONObject 我用的是fastjson的JSONObject,cell就是我需要解析的实体Map,其他类型的实体看具体情况具体分析
JSONObject object = mapper.readValue(mapper.writeValueAsBytes(cell), JSONObject.class);

  结束


 

Fastjson的JSONObject.toJSON()解析复杂对象发生内存泄漏问题的更多相关文章

  1. 使用fastjson 进行jsonObject转实体类对象

    使用fastjson 进行jsonObject转实体类对象   1 <dependency> 2 <groupId>com.alibaba</groupId> 3 ...

  2. C++析构函数的自动调用(用于父类指针指向子类对象,内存泄漏问题)

    class A {public:A() { printf("A \n"); }~A() { printf(" ~A \n"); } // 这里不管写不写virt ...

  3. JVM的内存管理、对象的生命周期、内存泄漏

    1 JVM内存 分为“堆”.“栈”和“方法区”三个区域,分别用于存储不同的数据 1.1 堆 JVM在其内存空间开辟一个称为”堆”的存储空间,这部分空间用于存储使用new关键字所创建的对象. 1.2 栈 ...

  4. Java内存泄漏解析!

    前言: 内存管理是Java最重要的优势之一,你只需创建对象,Java垃圾收集器会自动负责分配和释放内存.但是,情况并不那么简单,因为在Java应用程序中经常发生内存泄漏. 本章会说明什么是内存泄漏,为 ...

  5. Java匿名对象导致的内存泄漏

    这几天与在某群与群友讨论了Runnable匿名对象导致内存泄漏的相关问题,特此记录一下. 示例代码如下: package com.memleak.memleakdemo; public class L ...

  6. GDI 对象的释放与内存泄漏的问题研究

    最近写了一个GDI 绘图的程序,过程中遇到一个奇怪的问题,就是 定时器定时一会GDI绘的图就消失了..后来经过分析,原来是 GDI对象数量过多 ,即GDI对象超过10000个 导致内存泄漏的问题.找到 ...

  7. 解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...

  8. fastJson解析复杂对象时碰到的问题

    碰到map对象无法解析出来,发现问题是缺少有get/set方法,否则无法解析. 对象转json字符串 JSON.toJSONString(module) json字符串转对象(必须是pojo) mod ...

  9. Android JSON、GSON、FastJson的封装与解析

    声明: 1.本帖只提供代码,不深入讲解原理.如果读者想要深入了解,那就不要在这个帖子上浪费时间了 2.客户端用的是Google官方的Volley访问服务器,具体了解Volley请戳 这里 3.本帖三种 ...

随机推荐

  1. 初识python: 装饰器

    定义: 本质是函数,功能是"装饰"其它函数,即为其他函数添加附加功能原则: 1.不能修改被装饰函数的源代码: 2.不能修改被装饰函数的调用方式实现装饰器知识储备: 1.函数即&qu ...

  2. ubuntu 18.04 安装mongodb并设为开机自启动

    导入包管理系统使用的公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB4 ...

  3. Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. 【洛谷】P1067 多项式输出

    原题链接:P1067 多项式输出 题目分析:学长推荐的OJ网站 --洛谷,发现挺好用的还可以下载提交出错的数据. 废话就不多说了,这道题属于基础题.提交出错主要是因为一些小细节不到位,这里就不一一赘述 ...

  5. SCALA-基础知识学习(一)

    概述 本人开始学习scala的时候,是在使用和开发spark程序的时候,在此为了整理.记录和分享scala的基础知识,我写这篇关于scala的基础知识,希望与广大读者共同学习沟通进步.如果有些代码比较 ...

  6. 1.配置桥接,并抓包验证 2.实现免密登录 3.修改登录端口: 22-》2222 4.不允许root用户远程登录 5.创建用户sshuser1,并设置密码,且只允许sshuser1远程ssh登录

    1.配置桥接:  抓包时如果有ens160的ICMP,说明我们的桥接搭建成功通过桥接访问到了ens160(这里忘加图片了) (1)创建一个桥接设备和会话 (2)添加设备和会话到桥接设备上 (3)启动从 ...

  7. 《剑指offer》面试题41. 数据流中的中位数

    问题描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例 ...

  8. DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp

    目录 DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp 总结 datasystem check分析 漏洞点 利用思路 exp hehepwn 漏洞点 exp hahapwn 漏洞点 e ...

  9. 抓包分析与mock实战

    Charles下载安装 官网下载安装:https://www.charlesproxy.com/ 电脑证书配置 如果不配置证书,无法抓取https协议 配置证书: 1 - 打开Charles,在hel ...

  10. 【刷题-LeetCode】199 Binary Tree Right Side View

    Binary Tree Right Side View Given a binary tree, imagine yourself standing on the right side of it, ...