标签: weak-references

ConditionalWeakTable <TKey,TValue>应该用于非编译目的吗?

我最近ConditionalWeakTable<TKey,TValue>在我的搜索中遇到了一个IDictionary使用弱引用的类,正如这里这里的答案中所建议的那样.

一篇明确的MSDN文章介绍了该类,并指出:

您可以在System.Runtime.CompilerServices命名空间中找到类.... 它在CompilerServices中,因为它不是通用字典类型:我们打算只让编译器编写者使用它.

然后再说:

...有条件的弱表不是一个通用的集合...但是如果你正在编写自己的.NET语言并且需要公开将属性附加到对象的能力,你一定要查看条件弱表.

与此一致,该类的MSDN条目描述如下:

使编译器能够将对象字段动态附加到托管对象.

显然它最初是为了一个非常特定的目的而创建的 - 帮助DLR,System.Runtime.CompilerServices命名空间体现了这一点.但它似乎发现了更广泛的用途 - 即使在CLR中也是如此.例如,如果我在ILSpy中搜索ConditionalWeakTable的引用,我可以看到它在MEF类和内部WPF 类中使用.CatalogExportProviderDataGridHelper

我的问题是在编译器编写和语言工具之外是否可以使用ConditionalWeakTable,以及在未来的.NET版本中是否会产生额外开销或实现变化的风险.(或者应该避免使用像这样的自定义实现).

另外也进一步阅读这里,这里这里有关如何ConditionalWeakTable利用一个隐藏的CLR实现的ephemerons(通过System.Runtime.Compiler.Services. DependentHandle)来处理键和值之间的周期问题,以及如何能够不容易在一个自定义的方式来完成.

c# clr garbage-collection weak-references ephemeron

32
推荐指数
1
解决办法
4736
查看次数

IBOutlet和其他弱者或弱者

我已将项目切换到ARC,我不明白是否必须使用strongweak用于IBOutlets.Xcode执行此操作:在界面构建器中,如果创建一个UILabel例如我将它与助理编辑器连接到我的ViewController,它创建:

@property (nonatomic, strong) UILabel *aLabel;
Run Code Online (Sandbox Code Playgroud)

它使用了strong,而不是我在RayWenderlich网站上阅读的教程说:

但对于这两个特殊属性我还有其他计划.而不是 strong,我们将其声明为weak.

@property (nonatomic, weak) IBOutlet UITableView *tableView;
@property (nonatomic, weak) IBOutlet UISearchBar *searchBar;
Run Code Online (Sandbox Code Playgroud)

Weak是所有插座属性的推荐关系.这些视图对象已经是视图控制器视图层次结构的一部分,不需要在其他地方保留.声明出口的最大好处weak是可以节省编写viewDidUnload方法的时间.

目前我们viewDidUnload看起来像这样:

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.tableView = nil;
    self.searchBar = nil;
    soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)

您现在可以将其简化为以下内容:

- (void)viewDidUnload
{
    [super viewDidUnload];
    soundEffect = nil;
}
Run Code Online (Sandbox Code Playgroud)

所以使用weak,而不是strong,并删除设置为nil videDidUnload,而不是Xcode使用strong,并使用self... = nil …

weak-references ios ios5 automatic-ref-counting strong-references

32
推荐指数
2
解决办法
2万
查看次数

JVM G1GC的混合gc没有收集太多旧区域

我的服务器在CentOS 6.7上使用1.8.0_92,GC参数是'-Xms16g -Xmx16g -XX:+ UseG1GC'.所以默认的InitiatingHeapOccupancyPercent是45,G1HeapWastePercent是5,而G1MixedGCLiveThresholdPercent是85.我的服务器的混合GC从7.2GB开始,但它越来越少,最后老一代保持大于7.2GB,所以它总是尝试做并发标记.最后所有堆都耗尽并且发生了完整的GC.完全GC后,使用的旧版本低于500MB.

老一代

我很好奇为什么我的混合GC不能收集更多,看起来像实时数据不是那么多......

我曾尝试打印g1相关信息,并发现许多消息如下,看起来我的旧版包含很多实时数据,但为什么完整的GC可以收集这么多......

G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 190 regions, reclaimable: 856223240 bytes (4.98 %),  threshold: 5.00 %
Run Code Online (Sandbox Code Playgroud)

以下日志是将InitiatingHeapOccupancyPercent修改为15(启动并发标记为2.4GB)以加快速度的结果.

### PHASE Post-Marking
......
### SUMMARY  capacity: 16384.00 MB  used: 2918.42 MB / 17.81 %  prev-live: 2407.92 MB / 14.70 %  next-live: 2395.00 MB / 14.62 %  remset: 56.66 MB  code-roots: 0.91 MB
### PHASE Post-Sorting
....
### SUMMARY  capacity: 1624.00 MB  used: 1624.00 MB …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection weak-references g1gc

32
推荐指数
1
解决办法
1367
查看次数

WeakReference和事件处理

通过WeakReference实现事件处理是一个好习惯,如果该事件是唯一持有引用的东西,并且我们需要对象进行垃圾回收?

作为一个论点:

人们说,如果你订阅某些东西,你有责任取消订阅,你应该这样做.

.net c# design-patterns weak-references

31
推荐指数
4
解决办法
2万
查看次数

在.Net中实现弱字典

我在哪里可以找到IDictionary使用弱引用的良好实现?

字典应该只保留对值的弱引用,并最终清除死引用本身.

或者我应该自己写吗?

.net dictionary weak-references

30
推荐指数
2
解决办法
1万
查看次数

在强者退出之后,为什么我的弱参考不被清除?

我有点顽固,但我想了解弱弱和强烈的参考,所以这就是为什么我再次问你.

考虑一下:

__weak NSString* mySecondPointer = myText;   
NSLog(@"myText: %@", myText);
Run Code Online (Sandbox Code Playgroud)

结果是myText: (null)非常明显的 - 弱引用在赋值后设置为null,因为没有对尖头对象的强引用.

但在这种情况下:

__strong NSString* strongPtr = [[NSString alloc] initWithFormat:@"mYTeSTteXt %d"]; 
// weak pointer points to the same object as strongPtr
__weak NSString* weakPtr = strongPtr;
if(strongPtr == weakPtr) 
     NSLog(@"They are pointing to the same obj");        
NSLog(@"StrongPtr: %@", strongPtr);
NSLog(@"weakPtr: %@", weakPtr);

NSLog(@"Setting myText to different obj or nil");

// after line below, there is no strong referecene to the created object:
strongPtr = [[NSString alloc] …
Run Code Online (Sandbox Code Playgroud)

weak-references reference-counting objective-c strong-references

28
推荐指数
1
解决办法
3065
查看次数

事件如何导致C#中的内存泄漏?弱引用如何帮助缓解这种情况?

有两种方法(我知道)在C#中导致无意的内存泄漏:

  1. 不处理实施的资源 IDisposable
  2. 不正确地引用和取消引用事件.

我真的不明白第二点.如果源对象的生命周期比侦听器长,并且当没有其他引用时,侦听器不再需要事件,则使用普通的.NET事件会导致内存泄漏:源对象将侦听器对象保存在内存中应该是垃圾收集.

你能用C#中的代码解释事件如何导致内存泄漏,以及如何使用弱引用和没有弱引用来编写代码来解决它?

.net c# events weak-references

27
推荐指数
2
解决办法
2万
查看次数

使用__block和__weak

我已经读完了这个帖子:"__block"关键字是什么意思?讨论了什么__block用于但我对其中一个答案感到困惑.它说__block是用来避免保留周期,但它下面的评论让我不确定.

我正在使用这样的东西:

 self.someProperty = x; //where x is some object (id)
 __block __weak VP_User *this = self;

 //begin a callback-style block
     this.someProperty = nil;
Run Code Online (Sandbox Code Playgroud)

我需要同时使用__block__weak?看起来这种方式有什么明显的问题吗?

weak-references objective-c objective-c-blocks

27
推荐指数
2
解决办法
2万
查看次数

.NET中的弱事件?

如果对象A侦听来自对象B的事件,则对象B将使对象A保持活动状态.是否存在可以阻止这种情况的弱事件的标准实现?我知道WPF有一些机制,但我正在寻找与WPF无关的东西.我猜测解决方案应该在某处使用弱引用.

.net events garbage-collection weak-references

26
推荐指数
2
解决办法
7159
查看次数

Bitmap,Bitmap.recycle(),WeakReferences和Garbage Collection

在Android上使用AFAIK时,建议将Bitmap对象引用为WeakReferences以避免内存泄漏.当不再保留位图对象的硬引用时,垃圾收集器将自动收集它.

现在,如果我理解正确,必须始终调用Bitmap.recycle()方法来释放Bitmap.我认为这是因为Bitmap对象具有特殊的内存管理.

那是对的吗?

如果这是真的,当使用WeakReferences时,必须存在内存泄漏,因为在释放WeakReferences时永远不会调用Bitmap.recycle().或者,不知何故,WeakReferences是否足以避免内存泄漏?

谢谢

android garbage-collection memory-leaks weak-references bitmap

24
推荐指数
1
解决办法
2万
查看次数