文档章节

fastjson导致java.lang.OutOfMemoryError: PermGen spac

l
 lizhi.zero
发布于 2016/07/13 17:53
字数 466
阅读 91
收藏 0

fastjson 1.2.5 

从携程获取机票订单详情的时候,返回的json对象较为复杂且内容巨多,同事通过fastjson解析成java对象。用户每次请求都会执行如下代码片段:

ParserConfig,XmlDateTypeDeserializer,DateTypeDeserializerS这三个类是工具类为什么要每次请求的时候都要new呢,明显可以作为工具使用,先不纠结这个。咱先重现内存溢出,永久代的内存溢出,模拟http请求,同时发起1000个,果然内存溢出了。

1.通过jsp -l 发现jetty 容器的pid=2557

 

2. jstat -gc 2557 250 20

 

发现jvm一直在进行ygc和fgc,而且永久代已经用完了,难道上述代码真能引起PermGen spac吗?我们知道永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段,深入java虚拟机中介绍常量池也是属于永久代,永久代=方法区+运行时常量池。

3.jmap -histo -F 2557  加上"-F"就会强制执行 显示对中的对象统计信息

 

发现json在使用asm生产了很多代理类

初步猜想是fastjson在通过动态代理的时候生成了代理类,每次请求都会生成新的代理,导致永久代一直加载新的类信息,结果PermGen spac出现了。

4.查看代码验证猜想,把 ParserConfig,XmlDateTypeDeserializer,DateTypeDeserializer放到静态块内初始化,这样三个类只有一个实例,通过修改代码并测试,发现少了ASM生成的动态代理类,异常也不见了。

5.这到底是为什么呢?为什么在new ParserConfig,XmlDateTypeDeserializer,DateTypeDeserializer这个三个类的时候会生成很多代理呢?并且还有其他动态代理类出现了,继续研究fastjson源码。

© 著作权归作者所有

共有 人打赏支持
l
粉丝 1
博文 16
码字总数 4859
作品 0
heap space 和 permgen space 溢出的简单解决方法和原理笔记

1 . PermGenspace 全称是Permanent Generationspace,是指内存的永久保存区域. 用于存放,Class和Meta的信息,Class在被 Load的时候被放入PermGenspace区域.所以当我们的应用服务器在启动的时候...

orpheus
2009/11/18
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

本来想写一写项目中遇到的内存溢出的问题,看了好多博客,发现有一篇特别好的博客,拾人牙慧,共享分享。 转载:http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryErro...

mengdonghui123456
2017/02/07
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemoryError异常的常见原因...

lcdmusic
2015/01/20
0
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

一,java开发中: java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。 导致OutOfMemory...

今日竹石
2014/04/17
0
0
【java异常】java.lang.OutOfMemoryError: PermGen space

问题描述 java程序运行时报PermGenspace错误 错误信息 Exception in thread "DispatcherThread" java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProce......

季_苗
2016/09/13
182
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx防盗链、访问控制、Nginx解析PHP相关配置、Nginx代理

Nginx防盗链 在配置文件里写入以下内容: 用curl测试 访问控制 Nginx限制某些IP不能访问或者只允许某些IP访问。 配置文件写入如下内容: allow 表示允许访问的IP,deny限制访问的IP。 匹配正...

黄昏残影
8分钟前
0
0
自己动手实现RPC服务调用框架

转载 TCP的RPC 引言 本文利用java自带的socket编程实现了一个简单的rpc调用框架,由两个工程组成分别名为battercake-provider(服务提供者)、battercake-consumer(服务调用者)。 设计思路...

雨中漫步的鱼
10分钟前
0
0
Centos6.x安装之后的9件事

Centos6.x安装之后的9件事 这些不是必须都做的,只不过是我个人的习惯,在此记录一下。 1.修改yum源到国内 CentOS系统更换软件安装源 备份你的原镜像文件,以免出错后可以恢复。 mv /etc/yu...

叶云轩
16分钟前
5
0
springboot2 使用jsp NoHandlerFoundException

开发图片上传功能,为验证测试功能是否正常,使用JSP编写表单提交进行测试 开发完成后,请求API提示如下异常: No mapping found for HTTP request with URI [/WEB-INF/jsp/avatar_upload.j...

showlike
22分钟前
0
0
springboot踩坑记--springboot正常启动但访问404

一 spring boot的启动类不能直接放在main(src.java.main)这个包下面,把它放在有包的里面就可以了。 二 正常启动了,但是我写了一个controller ,用的@RestController 注解去配置的controlle...

onedotdot
23分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部