首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ASP.NET内存泄漏/使用DataTable的高内存

ASP.NET内存泄漏/使用DataTable的高内存
EN

Stack Overflow用户
提问于 2017-08-03 08:47:24
回答 1查看 1.3K关注 0票数 0

我有一个asp.net网站是托管在IIS中的。我最近注意到,随着从数据库返回大量结果集,IIS工作进程的内存不断增加(每次运行查询时大约为400 is )。如果这些大型查询中有几个同时运行,它就会占用内存(已经看到内存达到5GB),服务器就会慢下来。

当数据加载到DataTable中时,我已经将其缩小为一行代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(storedProcedureName, connection))
using(DataTable dataTable = new DataTable())
{
    command.CommandType = System.Data.CommandType.StoredProcedure;
    connection.Open();

    using (SqlDataReader reader = command.ExecuteReader())
    {
        // Memory Spikes on dataTable.Load
        dataTable.Load(reader);
    }
}

我不明白的是,分配给DataTable的内存似乎没有像我预期的那样被释放。当DataTable超出作用域时,或者当网页被导航时,甚至当用户从站点登录时,内存保持在相同的水平上。这显然是多用户系统中的一个问题。

我使用了内存分析器,它在内存中存储了数千个字符串,这些字符串是DataTable中保存的查询的结果,但我不知道从哪里开始呢?我是不是误解了我该怎么处理这件事?

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 08:50:34

这不是问题所在。垃圾收集器就是这样工作的。当您释放一个对象时,它不会立即从内存中删除。它只是被标记为准备用于垃圾收集器。

这是微软考试书的引文。

堆栈在方法结束时自动清除。CLR会处理这件事,你不必担心。堆是另一个故事-它由垃圾收集器管理。在没有垃圾收集器的非托管环境中,您必须跟踪堆上分配了哪些对象,并且需要显式地释放它们。在.NET框架中,这是由垃圾收集器完成的。 垃圾收集器使用标记和紧凑算法工作。集合的标记阶段检查堆上的哪些项仍由根项引用。根可以是静态字段、方法参数、局部变量或CPU寄存器。如果垃圾收集器在堆中找到一个“活动”项,它将标记该项。检查完整个堆后,紧凑型操作将启动。然后,垃圾收集器将所有活动堆对象紧密地移动在一起,并释放所有其他对象的内存。要做到这一点,垃圾收集器必须确保在执行所有标记和压缩时没有状态发生更改。因此,所有线程在执行收集操作时都会被冻结。它还必须确保所有对活动对象的引用都是正确的。在移动对象之后,垃圾收集器将修复对对象的所有现有引用。

您可以尝试使用以下方法强制垃圾收集器执行清理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

此外,GC使用多代,只有第0代才容易清理,而GC首先要清理它。只有这样,GC才决定不能释放足够的内存--它将开始处理其他代的内存。而转移到这几代人可能会造成延迟。

更新:您也可以尝试将大数据集划分为小块并相应地检索它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45490237

复制
相关文章
PHP中的Session工作机制与Session ID的实现原理
客户端第一次访问某服务器,为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
友儿
2022/09/11
2.2K0
PHP Session
Session 保存在服务端。保存在超全局变量 $_SESSION。 设置 Session 在 PHP 文件最上方开启 Session session_start( [$options]); $_SESSION(['username'])='username'; PHPSESSIONID 保存在服务端文件中,也将 id 保存在 Cookie 中。 通过 Cookie 设置 Session 生存期 session_id( [$id]); session_name( [$name]); setcookie
康怀帅
2018/02/28
1.3K0
Spring Session工作原理
HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。
杨振涛
2019/07/30
1.2K0
Spring Session工作原理
Spring Session工作原理
HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。
2020labs小助手
2019/07/30
6240
Spring-Session基于Redis管理Session【面试+工作】
session同样是使用redis来做集中式存储,为了方便测试使用本地的6379端口redis,LettuceConnectionFactory是redis连接工厂类;
Java帮帮
2018/11/08
1.3K0
php session 的使用
学会php session可以在很多地方使用,比如做一个后台登录的功能,要让程序记住用户的session,其实很简单,看了下面的文章你就明白了。
一朵灼灼华
2022/08/05
8070
讲讲session是怎么工作的,session的用法?
马克-to-win:到现在为止,我们学会了一次单独的请求和响应之间传递参数。但是如何跨越几次请求响应之间传递参数呢?比如我以马克的身份登录,这是 一次请求响应。之后买书又是一次请求响应。如何买书的时候还记得买书的人是马克,而不是张三呢?马克这个参数存在哪呢?这是跨越两次访问。Sun公司为我 们提供了HttpSession这个接口。HttpSession session = request.getSession();通过这句话,你可以得到一个与你的浏览器绑定的session对象,存在Tomcat里。这 个session对象只认你这个浏览器,之后只要是你这个浏览器发出的请求,无论跨越多少次请求响应,这个session对象就对它开放,其它浏览器不能 访问。通过session.setAttribute()可以往session里面存值,session.getAttribute可以取值。问题是 session是如何识别你的浏览器呢?初学者可忽略:靠Cookie或者URL改写:如果浏览器支持Cookie,则使用Cookie;如果浏览器不支持Cookie或者Cookie功能被关闭,则自动使用URL改写方法。拿cookie来说(通常客户很少见关闭cookie,即使你关了,我也可以发现,之后提醒你打开或编程序重写URL),服务器往客户端写东西时,cookie会带上sessionid。当客户端再次访问服务器时,同一path下,会自动在html请求头中带上cookie信息,服务器可以在_COOKIE域中得取到想要的sessionid。
马克java社区
2021/07/07
6540
Windows凭据不工作
如果不是敲错IP、用户名、密码,报凭据不工作,一般情况下执行这几句命令后重启远程服务就正常了
Windows技术交流
2021/06/15
6.1K0
PHP设置Redis储存Session
我们在之前的文章已经讲到了session是将数据储存在本地文件中,并且将session_id返回给客户端(浏览器会储存在cookies里)。
仙士可
2019/12/19
2.7K0
PHP设置Redis储存Session
php实现SESSION跨域
稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com、 i.a.com、bbs.a.com。而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个子系统中都是可以登录使用的。各个服 务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在 i.a.com登录之后,进入www.a.com时,仍然需要重新登录,基本的通行证的问
wangxl
2018/03/08
2.6K0
php – Laravel 7 Session Lifetime
如果它的时间少于Laravel配置,则cookie将被删除,因为本地php.ini优先于Laravel配置.
Lansonli
2021/10/09
1.1K0
PHP session回收机制
由于PHP的工作机制,它并没有一个daemon线程,来定时地扫描session信息并判断其是否失效。当一个有效请求发生时,PHP会根据全局变量 session.gc_probability/session.gc_divisor(同样可以通过php.ini或者ini_set()函数来修改) 的值,来决定是否启动一个GC(Garbage Collector)。默认情况下,session.gc_probability = 1,session.gc_divisor =100,也就是说有1%的可能性会启动GC。
Java架构师必看
2021/03/22
9930
php中session原理详解
SESSION:服务器端的会话技术。为每一个访问者创建唯一的id(UID)(而且同一用户不同的浏览器也会生成不同的UID),并基于这个id(UID)来存储变量; UID存储在cookie中,亦或者通过URL进行传导;
陈大剩博客
2023/03/22
1.5K0
php中session原理详解
php中session原理详解
SESSION:服务器端的会话技术。为每一个访问者创建唯一的id(UID)(而且同一用户不同的浏览器也会生成不同的UID),并基于这个id(UID)来存储变量; UID存储在cookie中,亦或者通过URL进行传导;
高久峰
2023/09/18
2840
php中session原理详解
Redis保存PHP Session方法
Redis保存session用的命令是setex,用redis-cli monitor实时监测可以检测到。
wangxl
2018/07/27
5.6K1
Redis保存PHP Session方法
PHP漏洞之-Session劫持
服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的http表头内包含session id 的值。服务器使用http表头内的session id来识别时哪个用户提交的请求。
php007
2019/10/29
2K0
PHP漏洞之-Session劫持
Tomcat Session管理分析【面试+工作】
上文中在Tomcat的context.xml中配置了Session管理器RedisSessionManager,实现了通过redis来存储session的功能;Tomcat本身提供了多种Session管理器,如下类图:
Java帮帮
2018/11/22
7140
PHP设置Redis储存Session,自定义session驱动
我们在之前的文章已经讲到了session是将数据储存在本地文件中,并且将session_id返回给客户端(浏览器会储存在cookies里)。
宣言言言
2019/12/18
1.8K0
PHP 7.2警告: “Cannot change session name when session is active”[通俗易懂]
I had a similar problem but finally found a way through. The code below was my first approach that gave me errors.
全栈程序员站长
2022/07/19
1.1K0
PHP 7.2警告: “Cannot change session name when session is active”[通俗易懂]
php案例 session的基本使用
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 session输出出来 session输出出来 <?php echo "字符串输出";
贵哥的编程之路
2022/09/29
7500
php案例 session的基本使用

相似问题

php $_SESSION不工作

11

PHP不工作($_SESSION)

22

PHP session_name不工作

10

检查PHP ISSET($SESSION -)不工作

33

PHP session_decode不工作吗?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文