这可能是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. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  2. 字母 Letters

    D. 字母 Letters 内存限制:256 MiB 时间限制:500 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定两个长度相同且由大写英文字母组成的字符串 A 和 B,保证 ...

  3. Python 元类实现ORM

    ORM概念 ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于 SQL  的关系模型数据库结构中去.这样,我们在具体的操作实体对象的时候,就不 ...

  4. Linux上天之路(一)之Linux前世今生

    0. Linux的前世今生 linux是什么 linux是一个计算机的操作系统,与windows类似,是一款系统软件 操作系统 说到操作系统其实我们首先要思考三个问题: 1)操作系统是什么? 2)操作 ...

  5. K8s中的volumes-容器数据存放类型及位置

    学习对象:kubectl explain pod.spec.volumes.pod.spec.containers.image.volumeMounts 介绍Volumes 容器内部也有自己的空间,但 ...

  6. INFO client.RMProxy: Connecting to ResourceManager at hadoop

    1.查看防火墙是否没关闭. 2.用jps 命令查看是否没有启动resourcemanager

  7. Android学习笔记3

    (5)练习做一个实现两个数相乘的APP ①.java代码: //MainActivity.java package com.example.hello; import android.content. ...

  8. 【小测试】使用腾讯云上的群集版redis

    具体的文档请见:https://cloud.tencent.com/document/product/239/3205 群集版本相当于很多个redis进程构成一个群集,最大支持128个分片(猜测分片就 ...

  9. java多态instanceof介绍

    1 public static void method(Animal a) {//类型判断 2 a.eat(); 3 if(a instanceof Cat) {//instanceof:用于判断对象 ...

  10. java多态概述特点转型I

    1 package face_09; 2 3 import com.sun.jdi.Method; 4 5 /* 6 * 对象的多态性. 7 * class 动物 8 * {} 9 * 10 * cl ...