- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 C# 中的内存分配和垃圾收集方式有一定程度的了解。但即使在阅读了多篇文章并尝试了一些测试 C# 程序之后,我仍然对 GC 缺乏一些清晰的认识。为了简化问题,我创建了一个虚拟 ASP 核心 Web API 项目,其中包含一个包含一个 int 属性的 DummyPojo 类和一个创建数百万个 DummyPojo 对象的 DummyClass。即使在运行强制 GC 后,死对象也不会被收集。有人可以解释一下吗?
public class DummyPojo
{
public int MyInt { get; set; }
~DummyPojo() {
//Debug.WriteLine("Finalizer");
}
}
public class DummyClass
{
public async Task TestObjectsMemory()
{
await Task.Delay(1000 * 10);
CreatePerishableObjects();
await Task.Delay(1000 * 10);
GC.Collect();
}
private void CreatePerishableObjects()
{
for (int i = 0; i < 100000; i++)
{
DummyPojo obj = new() { MyInt = i };
}
}
}
然后在我的program.cs文件中,我刚刚调用了开始创建对象的方法。
DummyClass dc = new DummyClass();
_ = dc.TestObjectsMemory();
我运行该程序并使用 Visual Studio 的内存诊断工具拍摄了 3 个内存快照,每个快照等待 3 个 10 秒,一个在创建对象之前,第二个在创建对象之后,最后一个在触发 GC 之后。
我的问题是:
最佳答案
我对 VS 内存分析器不太熟悉,因此其中一些内容只是猜测。
首先,重要的是要记住您正在监视的内存类型。该图显示进程内存,我认为这意味着进程从操作系统分配的所有内存。当您分配更多对象时,该内存显然需要增加,但它不会与托管堆的大小(即您正在使用的实际内存)直接相关。 GC可以过度分配内存,以减少需要向操作系统请求内存的次数,并且除非确定一段时间内不再需要内存,否则不会将内存释放回操作系统。我主要使用dotMemory,它的图被分成每一代+LOH+非托管,使得GC的效果更容易看到。
与一些评论相反GC.Collect
应该阻塞直到收集完成:
Use this method to try to reclaim all memory that is inaccessible. It performs a blocking garbage collection of all generations.
但是你声明了一个终结器,这意味着所有对象在被收集时都会被放入终结器队列中。因此,即使在被“收集”之后,它们也会保持半死不活的状态。终结器旨在确保收集非托管资源,这应该罕见。我真的建议在对 GC 进行任何类型的调查时删除终结器。如果不涉及终结器队列及其所带来的所有复杂性,GC 就很难理解。
另请注意,只要行为不变,编译器就可以进行任何优化。由于内存分配不被视为“行为”,因此允许删除整个循环。
关于C# 内存分配、GC、死对象不匹配的内存诊断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76552560/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!