`

【原创】一次关于Netty+Gson造成内存泄露的分析排查

阅读更多



 最近做了一个内部系统之间的数据同步服务器,client端通过socket发送经过压缩的json数据到server端,server完成数据解码和保存。server架构:netty+Gson解码

 

在做压力测试的时候,竟然发现server内存泄露。分析内存泄露的时候,其实我们可以从简单方法入手,因为jdk1.6后自身就带有不错的内存分析工具,而且我认为使用好这些工具基本足够高,因为如果你对这些工具的理解不深入,即使再强大的工具也是对你帮助不大。

 

开始分析:

 

第一步:jmap -heap <pid> 看个内存快照

 

 using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 536870912 (512.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 67108864 (64.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 160563200 (153.125MB)
   used     = 131079984 (125.00761413574219MB)
   free     = 29483216 (28.117385864257812MB)
   81.63762555803571% used
From Space:
   capacity = 9175040 (8.75MB)
   used     = 0 (0.0MB)
   free     = 9175040 (8.75MB)
   0.0% used
To Space:
   capacity = 9043968 (8.625MB)
   used     = 0 (0.0MB)
   free     = 9043968 (8.625MB)
   0.0% used
PS Old Generation
   capacity = 357957632 (341.375MB)
   used     = 357954568 (341.37207794189453MB)
   free     = 3064 (0.00292205810546875MB)
   99.9991440327776% used
PS Perm Generation
   capacity = 25690112 (24.5MB)
   used     = 25614800 (24.428176879882812MB)
   free     = 75312 (0.0718231201171875MB)
   99.70684440768495% used

10160 interned Strings occupying 880136 bytes.

经过一段时间运行,内存老生代满了,而且一直释放不了。
结合jcosonle运行图会更直观

 

  
 

这时候,再结合命令:jstat -gcutil <pid>  10000 20查看内存使用和回收快照,发现几十次大量的轻回收和全回收,轻回收每次时间达到2秒。

 

 

 第二部:既然确定存在内存泄露,那么就定位谁泄露,这一般是最难的地方。使用命令:jmap -histo <pid>

 


 num     #instances         #bytes  class name
----------------------------------------------
   1:       1186682       85441104  java.lang.reflect.Field
   2:       1186506       56952288  com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1
   3:       1271453       50858120  java.util.LinkedHashMap$Entry
   4:        733627       38708968  [C
   5:       1268334       30440016  com.google.gson.reflect.TypeToken
   6:        437746       29974120  [I
   7:        215160       22299464  [Ljava.util.HashMap$Entry;
   8:        122745       17675280  java.text.DecimalFormat
   9:        191610       14843680  [Ljava.lang.Object;
  10:        122746       13747552  java.util.GregorianCalendar
  11:        122746       11783616  sun.util.calendar.Gregorian$Date
  12:        116114       10890136  [B
  13:        336981       10783392  java.util.HashMap$Entry


 。。。。。


Total      11229733      542330424

就凭前两句,我大概断定是gson的问题。产生了大量gson的类。

   1:       1186682       85441104  java.lang.reflect.Field
   2:       1186506       56952288  com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1

但是,我是不会怀疑是gson的问题,而是在思考是不是使用方式不正确。

 

 

第三部:代码分析

 

gson是放在decoder里面对报文进行解码的

 

out.add(new Gson().fromJson(new String(beanBytes), Trade.class));

 

 

这里省略1万字各种测试对比,反正最后结果改成这样:

 

private static final Gson gson = new Gson();//做成单例
......
out.add(gson.fromJson(new String(beanBytes), Trade.class));

 

 

第四部:压测验证结果

 

 

 

 

 

 从图片显而易见,没有内存泄露,最后那一条下坠的横线,是我为了确认问题,做了一次全回收,回收后,内存释放到只有20多M,非常好。

 

 

 

 PS:为什么这写有问题,我也没搞明白,希望哪位大牛指点下。

 

 

  • 大小: 55.7 KB
  • 大小: 85 KB
分享到:
评论

相关推荐

    基于netty+websocket+springboot的实时聊天系统项目源码.zip

    1、基于netty+websocket+springboot的实时聊天系统项目源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...

    基于springboot+netty+vue构建的类似bililbili的弹幕群聊系统,个人娱乐项目,可用于前后端开发学习研究

    基于springboot+netty+vue构建的类似bililbili的弹幕群聊系统,个人娱乐项目,可用于前后端开发学习研究 基于springboot+netty+vue构建的类似bililbili的弹幕群聊系统,个人娱乐项目,可用于前后端开发学习研究 ...

    springboot-nettysocketio +netty+activeMq在线客服系统

    springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot...

    springboot+netty+websocket+redis

    Redis是一款开源的内存数据库,常用于缓存、会话管理和消息队列。在分布式聊天应用中,Redis可以用来存储用户的在线状态、聊天历史记录等实时数据,以减轻后端数据库的压力。Redis的高并发和低延迟特性,对于实时...

    毕设项目:基于netty+websocket+springboot的实时聊天系统.zip

    毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+springboot的实时聊天系统 毕设项目:基于netty+websocket+...

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty的优势在于它的非阻塞I/O模型,这使得它在处理高并发连接时表现出色。它提供了丰富的网络协议支持,如...

    netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Es信息数据存储》源码

    netty案例,netty4.1中级拓展篇六《SpringBoot+Netty+Elasticsearch收集日志信息数据存储》源码 ...

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip基于springcloud+Netty+MQ+mysql的分布式...

    netty+thrift高并发高性能

    4. **优化的数据结构**:Netty内部使用了高效的数据结构,如ByteBuf来管理内存,避免了频繁的内存复制操作,进一步提高了性能。 #### 三、Thrift 在RPC中的应用 Thrift是由Facebook开发的一款跨语言服务开发框架,...

    netty+spring服务端-omen-1.1

    omen-1.1 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类...个人原创,部分代码参考网上其他文献。

    netty+kafka+storm

    接下来,Apache Storm是一个实时计算系统,能够持续处理无界数据流,保证每个消息都能得到精确一次的处理。Storm常用于实时大数据分析、在线机器学习等场景。在本案例中,Storm可能会接收到Kafka的数据流,并进行...

    springboot+netty+mybatis+sqlserver

    标题 "springboot+netty+mybatis+sqlserver" 涉及到的是一个使用Spring Boot、Netty、MyBatis以及SQL Server构建的项目。这个项目可能是一个高性能、轻量级的网络通信应用,利用Spring Boot的便利性和Netty的高效...

    spring+netty+mybatis整合实例

    Netty则是一个高性能、异步事件驱动的网络应用程序框架,常用于构建高并发、低延迟的网络服务;MyBatis是一个持久层框架,它支持定制化SQL、存储过程以及高级映射,使得数据库操作更加便捷。现在,我们将详细讨论...

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统源码+项目说明(毕业设计).zip

    【资源说明】 基于springcloud+Netty+MQ+mysql的分布式即时聊天系统源码+...* 长连接管理子系统包含在线状态管理模块、聊天主模块、消息推送模块,其中聊天主模块包括一对一聊天和群聊功能; * 聊天信息子系统包含群聊

    (nginx+redis+zookeeper+activemq+storm+dubbo+netty+jvm+并发编程锁+项目实战).txt

    (nginx+redis+zookeeper+activemq+storm+dubbo+netty+jvm+并发编程锁+项目实战)

    基于netty+mqtt3.1.1+springboot+jdk8 实现的 mqtt 服务端跟客户端.zip

    这是一个基于Java技术栈,具体是Netty、MQTT 3.1.1协议、Spring Boot框架和JDK 8实现的MQTT服务器和客户端的项目。这个项目对于学习和实践物联网(IoT)通信以及Java后端开发具有很高的价值,尤其适合作为毕业设计的...

    Spring Boot 整合 Netty + WebSocket 实时消息推送

    Netty则是一个高性能、异步事件驱动的网络应用程序框架,常用于构建高度可定制的网络服务器。当Spring Boot与Netty结合使用时,可以创建出高效、稳定的实时消息推送系统。 在"Spring Boot 整合 Netty + WebSocket ...

    netty+websocket实现心跳和断线重连

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 和 WebSocket 实现心跳检测和断线重连机制。 首先,我们需要理解 ...

Global site tag (gtag.js) - Google Analytics