Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >去不去GC.Collect?

去不去GC.Collect?
EN

Stack Overflow用户
提问于 2011-03-09 08:27:36
回答 4查看 2.8K关注 0票数 23

读了这个古老但经典的编写高性能托管应用程序-初级文档,我看到了下面的陈述

GC是自调优的,并将根据应用程序内存要求进行调整。在大多数情况下,以编程方式调用GC会阻碍这种调优。通过调用GC.Collect“帮助”GC很可能不会提高应用程序的性能。

我正在处理的应用程序,在给定的时间点,消耗大量的内存。当我在消耗内存的代码中完成时,我将调用GC.Collect。如果我不这样做,我就会走出记忆异常。这种行为是无可辩驳的,但粗野地说,有30%的时候,我都会失去记忆。在添加GC.Collect之后,我从来没有从内存异常中得到这个结果。即使这份最佳实践文件提出反对意见,我的行动是否正当?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-09 08:51:29

GC中的部分内容是内存中的对象是分代的,因此早期的收集比其他的更频繁。这有助于节省性能,因为不总是试图收集长期存在的对象。

考虑到这一点,当您自己打电话给GC.Collect()时,可能会发生两件事。首先,您最终会花费更多的时间进行收集。这是因为除了手动的GC.Collect()之外,正常的背景集合仍然会发生。第二种情况是,您将把内存保存得更长,因为您将一些东西强加到不需要使用的高阶生成中。换句话说,自己使用GC.Collect()几乎总是一个坏主意。

在一些情况下,垃圾收集器的性能并不总是很好。其中之一是大型对象堆。对于大于一定大小的对象(80,000字节,IIRC,但这可能是旧的),这是一个特殊的生成。这一代人几乎从来没有被收集,几乎从来没有压实过。这意味着,随着时间的推移,您可能会在内存中出现许多无法释放的大漏洞。物理内存并没有被实际使用,也可以用于其他进程,但它仍然占用进程中的地址空间,默认情况下,您的地址空间限制在2GB以内。

这是一个非常常见的OutOfMemory异常源--您实际上并没有使用那么多内存,但是大对象堆中的漏洞占用了所有这些地址空间。到目前为止,这种情况最常见的方式是反复附加到大型字符串或文档中。这可能不是您的问题,因为在这种情况下,对GC.Collect()的任何调用都不会加重LOH,但在您的示例中,它似乎确实有所帮助。但是,这是我看到的绝大多数OutOfMemory异常的来源。

垃圾收集器并不总是运行良好的另一个地方是,当某些事情导致对象保持根时。一个例子是事件处理程序可以防止对象被收集。解决这一问题的方法是确保订阅事件的每个+=操作都有一个相应的-=操作来取消订阅。但是,GC.Collect()在这里不太可能有所帮助--对象仍然根植于某个地方,因此无法收集。

希望这为您提供了一条解决根本问题的途径,这首先导致需要使用GC.Collect()。但是,如果没有,当然,有一个工作程序比一个失败的程序更好。在我使用GC.Collect()的任何地方,我都会确保代码有很好的文档记录,说明了需要它的原因(没有异常),以及可靠地再现它所需的确切步骤和数据,以便将来想要删除它的程序员能够确定地知道什么时候这样做是安全的。

票数 29
EN

Stack Overflow用户

发布于 2011-03-09 08:31:07

大多数人会说,使您的代码正确工作比使它快速运行更重要。因此,当您不调用GC.Collect()时,它在30%的情况下无法工作,这比所有其他问题都要重要。

当然,这就引出了一个更深层次的问题:“为什么要得到OOM错误?是否有更深层次的问题需要解决,而不仅仅是调用GC.Collect()

但你发现的关于表演的建议。如果你的应用程序在30%的时间里失败了,你会关心它的性能吗?

票数 7
EN

Stack Overflow用户

发布于 2011-03-09 12:38:44

一般来说,GC.Collect不应该是必要的。如果映像存在于非托管内存中,那么一定要适当地使用GC.AddMemoryPressureGC.RemoveMemoryPressure

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

https://stackoverflow.com/questions/5248838

复制
相关文章
【预告:模块化工业PC(早10点开课)】正文: Wincc实现与数据库的交互以及报表的实现方式
经常会有朋友用到将部分有用的数据单独写到关系型数据库如:SQL Server ,MySQL等,然后通过制作报表进行数据的显示,而对于报表,我目前比较常用的是 SQL Server 自带的免费的 SSRS 来制作报表,用户可以通过网页的形式进行访问,页可以导出为PDF,WORD,或者可以选择打印,非常方便。
剑指工控
2021/11/09
2K0
反射获取属性字段及属性值
上篇文章我们可以通过自己的类加载器加载指定类了,在获取指定类后我们需要拿到类属性名称及类属性的值。 获取属性字段: public static List<Field> getFields(String
春哥大魔王
2018/07/23
4.3K0
反射获取属性字段及属性值
让SQL Server 2008默认使用Report Builder 2.0做报表设计器
由于SQL Server 2008比Report Builder 2.0先发布,所以默认情况下,在SSRS 2008中的报表管理器中单击“报表生成器”,打开的是Report Builder 1.0版本。这个版本的设计器功能很弱,所以肯定是要换成2.0版本的。
深蓝studyzy
2022/06/16
1.1K0
让SQL Server 2008默认使用Report Builder 2.0做报表设计器
Sql Server 中 根据具体的值 查找该值所在的表和字段
在我们的工作中经常遇到这样一个问题,在页面中保存一条数据,有个字段值为“张三”,但是,不知道这条数据保存在了哪个表中,现在我们想要追踪该值是存储到了那个表的那个字段中,具体要怎么操作呢?下面我们可以借助存储过程来解决这一问题
jamesjiang
2022/11/20
6.4K0
Sql Server 中 根据具体的值 查找该值所在的表和字段
SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL,动态列字段; 方法三:使用PIVOT关系运算符,静态列字段; 方法四:使用PIVOT关系运算符,动态列字段; 扩展阅读一:参数化表名、分组列、行转列字段、字段值; 扩展阅读二:在前面的基础上加入条件过滤; 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的话题
用户1112962
2018/07/03
4.4K0
Hive修改字段类型_hive表添加字段sql
hive修改字段类型语句:alter table 表名 change column 原字段名 新字段名 字段类型; alter table user_chain change column u_register u_registe date;(u_register原类型为string类型) 这样修改会报一个错误: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. The following columns have types incompatible with the existing columns in their respective positions : u_registe 原因分析:hive内部的类型转换的限制。总结为: 1、我们能够修改整型字段为double类型字段,因为double类型能够承载整型数据, 但是我们修改double类型字段为整型字段会有问题,因为整型字段不能够满足double数据 2、任何类型基本都可以转为字符串,任何double、float、int类型的数据都可以作为字符串处理 3、数据类型的转换为转换后的数据不会截断原来的数据
全栈程序员站长
2022/10/04
6.5K0
SQl 语句(常见) 新建,删除,修改表,新增字段,修改默认值
SQl 语句(常见) 新建,删除,修改表结构 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIMARY KEY , [字段1] nVarChar(50) default '默认值' null , [字段2] ntext null , [字段3] datetime, [字段4] money null , [字段5] int default 0, [字段6] Decimal (12,4) default 0, [字段7] image nu
学到老
2019/02/14
2.2K0
SQl 语句(常见) 新建,删除,修改表,新增字段,修改默认值
SQl 语句(常见) 新建,删除,修改表结构 新建表: create table [表名] ( [自动编号字段] int IDENTITY (1,1) PRIMARY KEY , [字段1] nVarChar(50) default '默认值' null , [字段2] ntext null , [字段3] datetime, [字段4] money null , [字段5] int default 0, [字段6] Decimal (12,4) default 0, [字段7] image null ,
学到老
2018/03/19
1.7K0
MySQL 数据库sql命令查看表属性,mysql查看指定表的各字段最大值、是否为空等属性实例演示
方法一: desc 后面 + 表名即可查看表的属性。 desc information_schema.processlist; 方法二: 利用 show columns from + 表名也可查看。 show columns from information_schema.processlist;
小蓝枣
2021/12/01
5.6K0
MySQL 数据库sql命令查看表属性,mysql查看指定表的各字段最大值、是否为空等属性实例演示
可重复执行SQL语句|建表、插入默认值、增加字段、删除字段、修改字段可重复执行SQL语句|oracle|mysql
在真实生产环境过程中,我们会用到表,但是随着后面功能的迭代以及更新,会对老表进行一些更新,比如加字段,修改字段类型等,那么随着越来越多的脚本更新,以及同一个项目在不同甲方中,为了保证项目的稳定性,我们需要对一些sql语句实现可重复执行的操作。
小小鱼儿小小林
2022/10/04
7.9K0
可重复执行SQL语句|建表、插入默认值、增加字段、删除字段、修改字段可重复执行SQL语句|oracle|mysql
SQL 把一个表内字段的值复制到另一个表内的特定字段
如果我们想要把一个表内某个字段的值,复制到另一个表内的另一个字段,那么我们怎么做呢? 假如我们想把a表的EmailAddress替换为b表的PasswordHash, 那么我们可以基于BusinessEntityID来识别每一行来进行匹配并更变数值。
繁华是客
2023/03/03
2.5K0
SQL注入绕过字段固定值限制
按照常规的手段,当addslashes与GBK相遇时,就是为了考察宽字节注入呗。 所以开开心心的构造URL username=-1%df' or 1=1 %23 所以得到了信息”You are logged in, but not as Admin.“ 这里才发现这个判断不是摆设,也就意味着按照以上的拼接语句,得到的第一条记录,并不是 username为Admin的。 所以需要想办法获取到第二条、第三条的数据。。
yumusb
2020/04/22
7090
SQL注入绕过字段固定值限制
Django ORM 查询表中某列字段值
方式一获取到的是一个QuerySet,内容是键值对构成的,键为表的列名,值为对应的每个值。
BigYoung小站
2020/05/04
3.7K0
SQL语句增加字段、修改字段、修改类型、修改默认值[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143685.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
4K0
关于SQL表字段值缺失的处理办法
在计算收益率时候,  收益率 = 收益 / 成本 一、如果成本为0,NULL,此时无法计算收益率; 方法: 1.将成本为0的数据 运算 (case when  cost =0 or cost is null then 0  else  income/cost end) as yeild; select account,sum(case when amount1 is null then 0 else amount1 END) as total,init_date from data_stock1 GROU
互联网金融打杂
2018/04/17
1.2K0
Vue02基础语法-插值+过滤器+计算属性+计算属性
示例: 使用计算属性,计算书本的总价定义测试数据,和计算属性,计算属性遍历书本记录,计算总价
天蝎座的程序媛
2022/11/18
1.4K0
sql注入之猜表猜字段暴库原理
现在讲下关于阿D注入和明小子检测存在注入猜表猜字段的原理.(使用工具一定要知道工具原理,方便后期自己完善/开发工具)
高久峰
2023/07/02
2620
点击加载更多

相似问题

SSRS SQL报表生成器删除列

224

在多个报表中使用的SSRS计算字段

21

SSRS报表生成器

10

SSRS报表生成器3.0:使用数据集查找设置报表属性变量

17

SSRS 2012报表生成器不使用子报表执行报表

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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