首页 > 系统相关 >对象序列化内存占用问题

对象序列化内存占用问题

时间:2024-02-22 15:45:40浏览次数:32  
标签:对象 占用 集合 内存 字符串 序列化

 

一般而言,前端发起一个查询,后端接收请求而后去数据库检索并得到结果集,之后序列化为字符串返回给前端展示。

在序列化方法接收一个集合到序列化(比如这里是json)的过程中,内存占用会增大吗?肯定会的,总体而言我们new出的对象,对象引用的字符、数字等都是存放在堆内存中;未序列化这些对象之前,他们就是被集合(这里是List)引用,占用内存大小是List集合所有对象的数据大小;
而当序列化的时候,我们把对象全部转为了一个字符串(集合越大这个字符串越大),这个字符串对象是要重新再堆内存中开辟一个空间来存储的。在这个过程中,可能内存的占用是未序列化时的2倍,直到线程请求结束,GC回收集合对象、字符串对象。

下面展示一个小实验来说明:

代码不具体展示,很简答,创建一个集合,new很多对象比如User什么的,往里面丢;序列化使用jackson什么都可以。

JVM参数为:-Xms64M -Xmx64M
  未加入序列化之前 加入序列化代码之后

内存
占用

 

 

 

 

详细
内存
占用

 

 

 

 


对象

 

 

 

 


可以看到序列化的时候,内存占用几乎是之前的2倍多,对象都停留在了老年代中,Meataspace也略有增长(毕竟引入了其他相关类,属于正常);大对象的占用由原来List大小为7M左右增长为13M,而且大对象还加入了一个String字符串。

  • 总之,传输的对象要保持一个合适的大小,比如采用分页,更细致的查询、分批处理、限制大小等,尽可能避免大对象传递以及序列化和反序列化
  • 追求性能的情况下,避免采用json、xml等这种序列化协议,而是采用Kryo、Protobuf、Thrift等

标签:对象,占用,集合,内存,字符串,序列化
From: https://www.cnblogs.com/Nuwa/p/18027475

相关文章

  • 偶发的系统卡顿内存飙升导致OOM
    线上有个小程序,客户反馈的现象是偶发性的卡主没响应,前端失去连接,点其他菜单都没响应。通过查看配置的dump目录有很多的GC日志,以及生成的一个堆内存快照。JVM的配置参数大概为:-Xms512M-Xmx512M-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=D:\dump\-XX:+PrintGCDetail......
  • [dotnet-Sec]初探反序列化
    [dotnet-Sec]初探反序列化参考Github上y4✌的开源笔记,狠狠学!环境搭建.NET:5.0IDE:Rider(JB家族)新建项目选择.NETCore(支持跨平台)下的控制台应用程序,然后创建这是接触到的关于dotnet的第一个反序列化demo,使用的是BinaryFormatter生成二进制流//Disablethewarning.#pragma......
  • 熟练使用有棱有角的内存、内存和磁盘的亲密关系
    ·队列一般是以环状缓冲区(ringbuffer)的方式来实现的·磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式·虚拟内存是指把磁盘的一部分作为假想的内存来使用·虚拟内存的方法有分页式和分段式两种。Windows采用的是分页式。该方式是指,在不考虑程序构造的情况下,把运......
  • 内存和磁盘的亲密关系
    ·DLL文件还有一个优点就是,在不变更EXE文件的情况下,只通过升级DLL文件就可以更新·栈清理处理指令不是程序记述的,而是在程序编译时由编译器自动附加到程序中的。编译器默认将该处理附加在函数调用方·另外,在C语言中,函数的返回值,是通过寄存器而非栈来返回的·栈一般是用来......
  • 第四章 让内存化方为圆
    《程序是怎样跑起来的》这本书的第四章“让内存化方为圆”是一个引人入胜的章节,它深入探讨了计算机内存的工作机制和管理方式。在阅读这一章后,我对内存的重要性和复杂性有了更深的理解。1.内存的物理结构:内存本质上是一种名为内存芯片的装置。内存芯片分为RAM、ROM等不同类型。......
  • C++内存管理
    C++内存管理目录C++内存管理内存模型堆与栈的区别其他说明new和deletemalloc/free和new/delete区别new运算符的原理new/delete的使用要点判断内存申请成功delete与delete[]区别参考资料内存模型内存类型作用生命周期常量存储区存放常量,不允许修改全局/静态存储......
  • Weblogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现
    0x00漏洞简介OracleFusionMiddleware(Oracle融合中间件)是美国甲骨文(Oracle)公司的一套面向企业和云环境的业务创新平台。该平台提供了中间件、软件集合等功能。OracleWebLogicServer是其中的一个适用于云环境和传统环境的应用服务器组件。OracleFusionMiddleware中的Oracle......
  • Apache Shiro反序列化漏洞 (CVE-2016-4437)复现
    0x00漏洞简介ApacheShiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。ApacheShiro1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触......
  • 承前启后,Java对象内存布局和对象头
    承前启后,Java对象内存布局和对象头大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象的内存结构。本文将......
  • 端口占用
    1,//tcpmux7,//echo9,//discard11,//systat13,//daytime15,//netstat17,//qotd19,//chargen20,//ftpdata21,//ftpaccess22,//ssh23,//telnet25,//smtp37,//time42,//name43,//nicname5......