rvh*_*rvh 5 c# java garbage-collection
与同事进行了这次讨论.当诸如c#或java垃圾之类的语言收集诸如字符串之类的对象,将它们返回到堆中时,它们是否也清除了这个内存块,例如用0或1覆盖?
我的假设是块按原样返回,除非使用诸如带有finalize重载的securestring之类的类来阻止块.
实际上,不,这不会发生。覆盖刚刚释放的内存需要时间,因此会降低性能。像SecureString这样的“安全”对象只是擦除自身,而不依赖于 GC。
\n\n更广泛地说,它在很大程度上取决于该特定语言的特定实现。每种假定存在 GC 的语言(例如 C#)都指定了有关垃圾收集如何以及何时发生的不同规则。
\n\n以 C# 为例,C# 规范不要求对象在释放后被覆盖,也不禁止这样做:
\n\n\n\n\n最后,在对象符合收集条件后的某个时间,垃圾收集器会释放与该对象关联的内存。
\n\n\xc2\xa73.9 C# 5.0 语言规范
\n
如果稍后将内存分配给引用类型,您将拥有一个执行您自己的自定义初始化的构造函数。如果稍后将内存分配给值类型,则在开始读取之前它会被清零:
\n\n\n\n\n初始化为默认值通常是通过在分配使用内存之前让内存管理器或垃圾收集器将内存初始化为全位零来完成的。因此,使用全位零来表示空引用是很方便的。
\n\n\xc2\xa75.2 C# 5.0 语言规范
\n
此外,C# 至少有两种实现——Microsoft 的实现和 Mono 的实现,因此仅说“C#”还不够具体。每个实现都可能决定覆盖(或不覆盖)内存。
\n| 归档时间: |
|
| 查看次数: |
448 次 |
| 最近记录: |