我知道这有很多线索.我读了一些.
我想知道在我的情况下是否正确 GC.Collect();
我有一台MMORPG服务器,在生产中它日夜在线.并且每隔一天重新启动服务器以实现对生产代码库的更改.每20分钟,服务器暂停所有其他线程,并序列化当前游戏状态.这通常需要0.5到4秒
GC.Collect();序列化之后是一个好主意吗?
显然,服务器不断创建和销毁游戏物品.
我会在性能或内存优化/使用方面获得臭名昭着的收益吗?
我不应该手动收集吗?
我已经读过如果在错误的时刻或太频繁地使用收集会如何变坏,但我认为这些存储既是收集的好时机,也不是那么频繁.
服务器在框架4.0中
更新回复评论:
我们随机经历服务器冻结,有时,出乎意料的是,服务器内存使用量将逐渐增加,直到它达到服务器占用太长时间来处理任何网络操作的程度.因此,我正在考虑许多不同的方法来解决这个问题,这就是其中之一.
我们的应用程序每天运行24小时,每周运行7天.有时CPU会达到100%然后再回到80%.与RAM相同.GC.Collect几小时后手动调用或自动离开它是否很聪明.
我们正在使用C#2010,SQL 2008和Fluent Nhiberanet.这是桌面应用程序.
我正在编写WinForms应用程序,到目前为止它包含37个表单.这是因为我的项目需求.
我的问题是:
谢谢你的帮助.
System.GC.Collect和之间有什么区别Dispose()?
它们不是用于同一目的,何时应该使用它们; 什么是最佳做法?
所以我有一个代码来检测插入该方法的设备
SerialPort.GetPortNames();
Run Code Online (Sandbox Code Playgroud)
无论如何,一切正常,除非我打开现有端口(从列表中选择它)
port = new SerialPort(portname, 9600);
port.Open();
Run Code Online (Sandbox Code Playgroud)
然后,如果设备被拔掉,它不会从列表中删除..我认为这是因为端口没有关闭..
但我无法弄清楚为什么它仍然在列表中如果我不手动关闭它,即使设备已拔下插头..
port.Close();
Run Code Online (Sandbox Code Playgroud)
因为如果我打开一个不在列表中的端口,它就不会出现在列表中.
谁能解释我这种行为?
NET已经很久了,现在又开始学习C#了.我想我多年前曾经问过的一件事,得到了答案,但现在完全忘记了它,因为它不是我暗中使用的东西,而是析构函数.当我正在学习C#时,我读了一篇关于如何在C#中创建它们的文章,但它让我感到疑惑.假设我实例化一个具有另一个类的对象的类.
Class C1
{
// Do something here
}
Class A
{
C1 objObjectToClass1 = new C1();
}
Class Main
{
A objObjectToClassA = new A();
}
Run Code Online (Sandbox Code Playgroud)
我使对象objObjectToClassA到null我已经导致相信这是相当于object = nothing在VB.NET.
objObectToClassA = null;
Run Code Online (Sandbox Code Playgroud)
这个动作也会破坏objObjectToClass1吗?
由于在CLR中调用垃圾收集器的开销,离开它是否更有效,或者当对象超出范围时强制进行垃圾收集?
我们知道,在运行时,当内存中没有足够的空间来形成对象时,垃圾收集会自动请求。据我所知,垃圾收集会自动调用,但是当我们在现实世界中进行一些编程时,调用垃圾收集就变得必不可少。举个例子,如果我们在第一步中编写一个程序,我想调用垃圾收集来优化内存以进一步创建对象的意思是在运行时。那么我们如何调用垃圾收集器呢?
我知道所有的理论:
我知道什么是GC,何时调用dispose,在调用时终结.
我想知道,在你的直播项目中..哪种情况已经使用了这一切.
我有一个wcf服务作为Windows服务托管,具有以下功能:
public int SendMultipleMessages(List<Message> messages)
{
foreach (var message in messages)
{
//Do some stuff with the messages ie. get an id to return, save info in a db.
}
//Would it make sence to collect here ??
Gc.Collect();
Task.Factory.StartNew(() =>
{
//very time demanding task
_sendRequestHandler.SendMultipleMessages(BatchId);
});
return BatchId;
}
Run Code Online (Sandbox Code Playgroud)
List <Message>对象(通常情况下)通常使用高达1 GB的内存,在这样的情况下调用GC.Collect是有意义的,因为我不再使用该列表,或者我应该让垃圾收集器自己处理这个?
菜鸟在这里。假设我做了一个这样的函数:
public void something()
{
List<string> list = new List<string>();
}
Run Code Online (Sandbox Code Playgroud)
然后我打电话给something()10x。它会创建 10 个同名对象,还是会替换为新的空对象,因此对象总数仍为 1?这样做会导致内存泄漏吗?抱歉英语不好。
只是想了解为什么destructor在实例被处置后在 USING 的范围之外被调用。我知道不需要destructor何时IDisposable实施。这是我的例子:
using System;
namespace Destructor
{
class Program
{
static void Main(string[] args)
{
using (var a = new A())
{
Console.WriteLine("... inside USING ...");
}
Console.WriteLine("...END...");
}
}
//............................................................
class A : IDisposable
{
public A()
{
Console.WriteLine("...Constructor called...");
}
~A()
{
Console.WriteLine("...Destructor called...");
}
public void Dispose()
{
Console.WriteLine("...Dispose called...");
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
...构造函数调用...
... 里面使用 ...
...处置称为...
...结尾...
...析构函数调用...
c# ×12
.net ×3
destructor ×2
performance ×2
asp.net ×1
clr ×1
finalizer ×1
object ×1
oop ×1
optimization ×1
serial-port ×1
winforms ×1