.NET GC中的UseStringDeduplication

时间:2019-05-10 07:14:47

标签: .net

是否存在类似于.NET的-XX:+ UseStringDeduplication JVM参数?

使用JetBrains dotMemory我看到有重复的字符串。

dotMemory screenshot

浪费的数量虽然不多,但仍然感觉有改进的空间。

1 个答案:

答案 0 :(得分:2)

简短版本:否

长版:

浪费是主观的-我猜测其中大多数是来自数据访问或类似访问的列名;不断检查在运行时看到的每个字符串会很快变得很昂贵,因此尽管代码可以进行这种操作,但在大多数情况下会产生很大的负面影响。在几乎所有情况下,这些字符串都是短暂的,并且 GC运行时(不确定),GC将非常有效地清除它们。

创建字符串时,运行时本身无法真正在全局级别上先发制人,因为这是字符串不可变的谎言,而对于库代码来说,它实际上是相对常见的( (而不是应用程序代码)来创建字符串单独,以用原位覆盖数据填充字符串。此处的典型用例是:在创建string之前,先从非连续的内存缓冲区填充字符串,而无需创建数据的额外线性化副本(例如,用1个副本代替2个)。 >

如果创建字符串的是您自己的自己代码(来自文件,网络等),则可以添加自己的内部代码;但是,我建议 为此使用全球合作伙伴(string.Intern-您会使其饱和并在所有地方造成负面影响 。而是使用您自己的范围内的合作伙伴,也许使用某种字典。问题是您需要为字典编写自己的比较器,该比较器可以在字节范围内作为键使用。