fastjson导致的OOM

大家好,我是烤鸭:

    今天又遇到OOM了,原因在于 fastjson 的 toJSONString。

    这是线上的报错信息。 将这个 TotalLoanDTO 对象 toJSONString 导致的OOM。日志如下。

2019-10-31 12:07:49.896 [TID:285.93.15724948639339801] [XNIO-1 task-14]  INFO  [class:com.sinoi logInfo==> 请求id:c8969c8a64c14a45b3079f218f7359a4,RPC调用服务异常,异常信息{}
com.alibaba.dubbo.rpc.service.GenericException: java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap spaceat com.alibaba.fastjson.serializer.SerializeWriter.expandCapacity(SerializeWriter.java:at com.alibaba.fastjson.serializer.SerializeWriter.writeFieldNameDirect(SerializeWriterat com.alibaba.fastjson.serializer.ASMSerializer_22_TotalLoanDTO.write(Unknown Source)at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:126)at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:275)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:648)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:590)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:555)at com.sinoiov.etc.aspect.ServiceLogAspect.getJson(ServiceLogAspect.java:98)at com.sinoiov.etc.aspect.ServiceLogAspect.loggerInf(ServiceLogAspect.java:81)at com.sinoiov.etc.aspect.ServiceLogAspect.aroundMethod(ServiceLogAspect.java:56)at sun.reflect.GeneratedMethodAccessor266.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethoat org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInat com.sinoiov.etc.aspect.SaasServiceAspect.aroundMethod(SaasServiceAspect.java:78)at sun.reflect.GeneratedMethodAccessor265.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgat org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspat org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethoat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocatat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethoat org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(at com.sinoiov.etc.finance.service.impl.TotalLoanServiceImpl$$EnhancerBySpringCGLIB$$94at com.sinoiov.etc.finance.api.impl.TotalLoanOperatorServiceImpl.queryTotalLoans(TotalLat com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:91)at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequeat com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(Heat com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEvenat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)

本地写了个test类测试一下。
启动命令:设置最大内存 10M
VM options : -Xmx10M

package src.rams.oom;import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.List;/*** @Author test* @Description //fastjson 测试 json的OOM* @Date 2019/11/4 10:19* @Param* @return*/
public class JsonOOM {static class DumpTest{}public static void main(String[] args) throws Exception {List<DumpTest> list = new ArrayList<>();for (int i = 0; i < 54000; i++) {DumpTest dumpTest = new DumpTest();list.add(dumpTest);}String string = JSON.toJSONString(list);System.out.println(string);}
}

我们先看一下测试方法的报错信息。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOfRange(Arrays.java:3664)at java.lang.String.<init>(String.java:207)at com.alibaba.fastjson.serializer.SerializeWriter.toString(SerializeWriter.java:425)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:650)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:590)at com.alibaba.fastjson.JSON.toJSONString(JSON.java:555)at src.rams.oom.JsonOOM.main(JsonOOM.java:31)

跟随源码看一下。

SerializeWriter out = new SerializeWriter(null, defaultFeatures, features);
// 初始化char 数组
protected char buf[] = new char[2048];

后续的 toJSONString 。

public static char[] copyOfRange(char[] original, int from, int to) {int newLength = to - from;if (newLength < 0)throw new IllegalArgumentException(from + " > " + to);char[] copy = new char[newLength];System.arraycopy(original, from, copy, 0,Math.min(original.length - from, newLength));return copy;
}

最后报在这一行:

char[] copy = new char[newLength];

由于数组较大,直接申请分配堆内存上的空间,导致堆内存溢出


再看一下生产上的OOM事件。同样的地方,都是在申请新的字符数组的时候导致的OOM。

 public void expandCapacity(int minimumCapacity) {int newCapacity = (buf.length * 3) / 2 + 1;if (newCapacity < minimumCapacity) {newCapacity = minimumCapacity;}char newValue[] = new char[newCapacity];System.arraycopy(buf, 0, newValue, 0, count);buf = newValue;
}

总结:

    控制内存大小和json序列化对象的大小。如果有一个较大的list 去 toJsonString的话,占用的字符串长度不够用,会申请多余的字符数组,直到够用。如果有一个几万对象的list去toJsonString的话,那估计药丸。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器中安装JsonView扩展程序

实际开发工作中经常用到json数据&#xff0c;那么就会有这样一个需求&#xff1a;在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来。 比如&#xff0c;在谷歌浏览器中访问&#xff1a;http://jsonview.com/example.json 展现效果如下&#xff1a; 那么安装了…

[css] 怎么实现移动端的边框0.5px?

[css] 怎么实现移动端的边框0.5px&#xff1f; 一种是通过transform中的scaleborder: 1px solid red;transform: scaleY(.5);一种是通过meta viewport中设置init-scale为0.5 <meta name"viewport" content"widthdevice-width, initial-scale0.5"> 一…

Serialized class com.xxx.xxxService must implement java.io.Serializable

大家好&#xff0c;我是烤鸭&#xff1a; 使用dubbo的时候&#xff0c;遇到如下的问题。 Serialized class com.xxx.xxxService must implement java.io.Serializable 1. 异常 dubbo无论使用哪个协议传递参数的时候&#xff0c;都需要参数实现序列化接口。 所以提示这个…

CS229 7.1应用机器学习中的一些技巧

本文所讲述的是怎么样去在实践中更好的应用机器学习算法&#xff0c;比如如下经验风险最小化问题&#xff1a; 当求解最优的 后&#xff0c;发现他的预测误差非常之大&#xff0c;接下来如何处理来使得当前的误差尽可能的小呢&#xff1f;这里给出以下几个选项&#xff0c;下面…

[css] 行内元素和块级元素有什么区别,如何相互转换?

[css] 行内元素和块级元素有什么区别&#xff0c;如何相互转换&#xff1f; 一般通过display属性来区分块级元素和行内元素&#xff0c;block代表块级元素&#xff0c;inline代表行内元素。 块级元素&#xff1a; 1、内容独占一行。 2、width和height可以设置。 3、margin和pa…

dubbo源码解析(一)

大家好&#xff0c;我是烤鸭&#xff1a; 今天和大家分享dubbo的源码解析。 1.SPI http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html介绍: SPI 全称为 Service Provider Interface&#xff0c;是一种服务发现机制。 SPI 的本质是将接口实现类的全限定名配…

8号团队-团队任务三:每日立会(2018-11-27)

团队信息&#xff1a; 1.团队序号 8 2.开发软件 飞机大战 3.今日整理人&#xff1a;徐浩茗 职位&#xff1a;项目经理 学号&#xff1a;2016035107247 4.本次团队会议共有8人参加 无缺席 团队汇报&#xff1a; &#xff08;截图&#xff09;如下 . 4.燃尽图 5.本次会议中遇…

[css] 说说你对低版本IE的盒子模型的理解

[css] 说说你对低版本IE的盒子模型的理解 一个CSS盒子由四部分组成&#xff0c;由内到外依次是&#xff1a;content、padding、border、margin。所谓盒子模型定义的是盒子宽高的计算方法&#xff0c;IE盒子模型的宽高为content、padding、border之和。而W3C盒子的宽高仅为cont…

Alibaba 开源工具 Arthas 使用

大家好&#xff0c;我是烤鸭&#xff1a; 很长时间没更新了&#xff0c;最近太忙了&#xff0c;只能抽空水点文章了&#xff0c;今天给大家介绍的是阿里的开源工具 Arthas 的使用。 1. 开源地址 Arthas 是Alibaba开源的Java诊断工具 https://github.com/alibaba/arthas 中文说…

[css] 你是如何规划响应式布局的?

[css] 你是如何规划响应式布局的&#xff1f; 从项目角度来讲&#xff0c; PC 和 Mobile 是一个项目还是两个项目&#xff1b;从方法流派来讲&#xff0c; 有栅栏布局&#xff0c;固定 viewport&#xff0c;使用 rem/pt/vw 单位&#xff0c;使用定位百分比&#xff0c;修改为 …

Oracle 用户,角色,权限等

权限管理是 Oracle 系统的精华&#xff0c;不同用户登录到同一数据库中&#xff0c;可能看到不同数量的表&#xff0c;拥有不同的权限。Oracle 的权限分为系统权限和数据对象权限&#xff0c;共一百多种&#xff0c;如果单独对用户授权&#xff0c;很囧&#xff0c;有一些用户需…

Java 面试题(4)—— 多线程

Java实现多线程有哪几种方式。 implements Runnable, implements Callable,extends Thread Callable和Future、FutureTask的了解。 Callable和 Future 是juc包下的接口。 Callable 可以异步执行任务&#xff0c;一般和 ExecutorService 的submit方法一起使用。 Future 可以监听…

[css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里?写个例子

[css] 如何让大小不同的图片等比缩放不变形显示在固定大小的div里&#xff1f;写个例子 图片等比缩放 img{ object-fit: cover/contain;}div宽高比例固定&#xff0c;跟随屏幕变化而变化&#xff0c;利用padding垂直方向的属性来实现个人简介 我是歌谣&#xff0c;欢迎和大家一…

[css] 行内css和important哪个优先级高?

[css] 行内css和important哪个优先级高&#xff1f; !important 将覆盖行内css css优先级&#xff1a;行内css>id选择器(#)>伪类(:)>属性选择器([])>类选择器(.) > 类型选择器(div p a等) > 通用选择器(*)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…

Password

题目 题解 由打表得对于任意\(i \geq 1\)&#xff0c;都有第\(i1\)行和第\(i3\)行相等、 于是我们可以分块维护一下。 然后做完了。 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm>us…

The temporary upload location [/tmp/tomcat.xxx/work/Tomcat/localhost/etc] is not valid

大家好&#xff0c;我是烤鸭: 下面又来踩坑实录了。主要是两个问题&#xff0c;第一是图片上传异常&#xff0c;第二是下载文件异常。其实都是在服务器上写入失败。有的人说是权限问题&#xff0c;但是这个一直没人动过。 由于过年放假&#xff0c;导致测试环境很长时间…

[css] 说说你对前端二倍图的理解?移动端使用二倍图比一倍图有什么好处?

[css] 说说你对前端二倍图的理解&#xff1f;移动端使用二倍图比一倍图有什么好处&#xff1f; 二倍图是指单位面积下设备像素与css像素个数之比为 4 的位图。移动端使用二倍图可以在Retina屏幕下保真展示。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃…

人生苦短,我用python

0.10 |— 模块1&#xff1a;开发基础(23)0.11 |— 模块2&#xff1a;文件、函数、模块(29)0.12 |— 模块3&#xff1a;OO、网络编程(19)0.13 |— 模块4&#xff1a;并发编程(13)0.14 |— 模块5&#xff1a;Mysql数据库(16)0.15 |— 模块6&#xff1a;web前端开发(34)0.16 |— 模…

spring 多线程 事务 源码解析(一)

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享的是spring 多线程事务源码分析。 环境&#xff1a; spring-jdbc 5.0.4.REALEASE 今天分享一下spring事务的方法&#xff0c;这一篇还没涉及到多线程。 简单说一下doBegin的方法&#xff1a; 强转获取当前的事务对象&#…

[css] 你对视网膜(Retina)分辨率有了解吗?有没有在实际中使用过?

[css] 你对视网膜(Retina)分辨率有了解吗&#xff1f;有没有在实际中使用过&#xff1f; Retina分辨率指的是屏幕的物理分辨率达到了使得人眼难以看到单个物理像素&#xff1b;具体应用应该就是dpr > 1的屏幕适配&#xff0c;需要根据不同dpr给出合适尺寸的图片&#xff1b;…