c# GC回收与代码块作用范围的问题

2024-09-01 00:08

本文主要是介绍c# GC回收与代码块作用范围的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在学socket编程,于是自己学着写了一个通信程序。

自定义一个用于传递通信信息的类,通过Json实现序列化和反序列化达到传输这个类的目的。

以下是byte[]和Message类的互相转化代码

 <span style="white-space:pre">	</span>public static byte[] serialize(MessageObject msg){DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(MessageObject));MemoryStream ms = new MemoryStream();ds.WriteObject(ms, msg);return ms.ToArray();}public static MessageObject deserialize(MemoryStream ms){DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(MessageObject));MessageObject msg = ds.ReadObject(ms) as MessageObject;return msg;}
但是在运行过程中出现了问题。

例:

第一次,传送消息"abc",成功

第二次,传送一张大图,成功

第三次,传送消息“abc",失败,异常:反序列化失败

经输出一些信息发现:若第一次传送byte[]长度为379(包含其他内容如传送时间,目的IP和端口等),第二次byte[]长度为1687535,则第三次传送byte[]长度远大于379

并且这种失败情况出现于文本长度为:短-长-短 的情况。

最后经调试成功解决,问题源于byte[]的定义在try catch的外部,而连接socket,接收byte[]等主要操作在try catch内部(每次接收byte[]都进行了new操作)

猜测原因: GC没有回收byte[]的内存(未出try catch代码块),尽管每次接收数据之前都进行new操作,但长byte的冗余数据还存在于内存中,导致新byte[]长度偏长,反序列化失败。

总结:考虑周全变量的生命周期,避免未进行回收的内存再次使用。

这篇关于c# GC回收与代码块作用范围的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125386

相关文章

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事