相关疑难解决方法(0)

大对象堆碎片

我正在研究的C#/ .NET应用程序正在遭受缓慢的内存泄漏.我已经使用CDB和SOS来尝试确定发生了什么,但数据似乎没有任何意义,所以我希望你们中的一个人之前可能已经经历过这种情况.

该应用程序在64位框架上运行.它不断地计算并将数据序列化到远程主机,并且正在大量地击中大对象堆(LOH).但是,我希望大多数LOH对象都是瞬态的:一旦计算完成并且已经发送到远程主机,就应该释放内存.然而,我所看到的是大量(实时)对象数组与空闲的内存块交织,例如,从LOH中获取一个随机段:

0:000> !DumpHeap 000000005b5b1000  000000006351da10
         Address               MT     Size
...
000000005d4f92e0 0000064280c7c970 16147872
000000005e45f880 00000000001661d0  1901752 Free
000000005e62fd38 00000642788d8ba8     1056       <--
000000005e630158 00000000001661d0  5988848 Free
000000005ebe6348 00000642788d8ba8     1056
000000005ebe6768 00000000001661d0  6481336 Free
000000005f214d20 00000642788d8ba8     1056
000000005f215140 00000000001661d0  7346016 Free
000000005f9168a0 00000642788d8ba8     1056
000000005f916cc0 00000000001661d0  7611648 Free
00000000600591c0 00000642788d8ba8     1056
00000000600595e0 00000000001661d0   264808 Free
...
Run Code Online (Sandbox Code Playgroud)

显然,如果我的应用程序在每次计算期间创建长寿命的大对象,我会期望这种情况.(它确实这样做,我接受会有一定程度的LOH碎片,但这不是问题.)问题是你可以在上面的转储中看到的非常小的(1056字节)对象数组,我在代码中看不到正在创建,并以某种方式保持根深蒂固.

另请注意,转储堆段时CDB不报告类型:我不确定这是否相关.如果我转储标记的(< - )对象,CDB/SOS报告正常:

0:015> !DumpObj 000000005e62fd38
Name: System.Object[]
MethodTable: 00000642788d8ba8
EEClass: 00000642789d7660
Size: 1056(0x420) bytes
Array: Rank 1, Number of elements 128, Type CLASS …
Run Code Online (Sandbox Code Playgroud)

.net c# memory-leaks memory-management windbg

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

由于字符串是不可变的,具有相同字符串值的变量是否指向相同的字符串对象?

一个)

        string s  = "value";
        string s1 = "value";
Run Code Online (Sandbox Code Playgroud)

s和s1引用变量是否指向相同的字符串对象(我假设这是因为字符串是不可变的)?

b)我意识到已经重新定义了相等运算符(==,> etc)来比较字符串对象的值,但是在使用静态方法Object.Equals()和Object.ReferenceEquals()比较两个字符串时是否相同?

感谢名单

.net c# string

16
推荐指数
1
解决办法
462
查看次数

字符串和垃圾收集

我听过有关这个主题的相互矛盾的故事,我正在寻找一点清晰.

如何string立即处理物体,或至少清除它的痕迹?

.net c# string garbage-collection

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

字符串文字是否由编译器优化?

C#编译器或.NET CLR是否对字符串文字/常量进行了任何巧妙的内存优化?我可以发誓我听说过"字符串内化"的概念,所以在程序的任何两位代码中,字面意思"这是一个字符串"实际上是指同一个对象(大概是安全的,字符串是什么一成不变的?).我在谷歌上找不到任何有用的参考资料......

我听错了吗?别担心 - 我的代码中没有用这些信息做任何可怕的事情,只是想更好地了解它的工作原理.

c# string optimization

15
推荐指数
3
解决办法
3141
查看次数

字符串不变性

字符串不变性是通过语句还是通过语句中的字符串来工作的?

例如,我了解以下代码将在堆上分配两个字符串.

string s = "hello ";
s += "world!";
Run Code Online (Sandbox Code Playgroud)

"你好"将留在堆上,直到垃圾收集; 现在引用"你好世界!" 在堆上.但是,以下行在堆上分配了多少个字符串... 1或2?此外,是否有工具/方法来验证结果?

string s = "goodbye " + "cruel world!";
Run Code Online (Sandbox Code Playgroud)

.net string immutability

12
推荐指数
1
解决办法
2313
查看次数

C#中的字符串常量内存池

大家都知道.Net框架中的String对象直接存储在堆内存中

我只是想了解.Net框架中是否有任何保留内存用于字符串.在java中,有一个名为SCMP(字符串常量内存池)的字符串保留内存,其中字符串初始化和垃圾收集就像堆内存中的其他对象一样.

c# memory string

9
推荐指数
2
解决办法
4090
查看次数

如何确定对象固定的原因

我试图找出为什么我的应用程序中的某些对象被固定.到目前为止我看过的对象是对象数组!gcroot显示数组被固定但我不知道如何弄清楚为什么它被固定.

输出:

0:000> !dumpobj 0239cea0
Name: System.Object[]
MethodTable: 793041d0
EEClass: 790eda54
Size: 528(0x210) bytes
Array: Rank 1, Number of elements 128, Type CLASS
Element Type: System.Object
Fields:
None

0:000> !gcroot 0239cea0
Note: Roots found on stacks may be false positives. Run "!help gcroot" for
more info.
Scan Thread 0 OSTHread f3c
Scan Thread 2 OSTHread e54
Scan Thread 4 OSTHread 748
Scan Thread 5 OSTHread fe0
Scan Thread 7 OSTHread 7a0
Scan Thread 9 OSTHread cf4
Scan Thread 10 OSTHread …
Run Code Online (Sandbox Code Playgroud)

.net windbg

6
推荐指数
2
解决办法
6041
查看次数

在.NET中进行事后分析有什么可能性(例如在程序崩溃之后)?

我们假设有一个C#程序,它用作Windows服务.让我们假设服务已经疯狂,并且像疯了一样消耗CPU和内存.它需要很快重新启动,因为它是一个生产系统.所以我没有太多时间收集运行时信息.也许快速浏览任务管理器......就是这样.

之后,我所拥有的只是log4net日志文件和用于事后分析的Windows事件日志.

假设我找到了问题的原因.其他人修复了它,也许程序员添加了一些额外的日志记录,所以我下次可以更快地找到类似的问题.尽管如此:我仍然依赖于日志文件的质量,并希望下次问题会以某种方式在记录中显示出来.

是否还有其他方法进行验尸分析?也许像线程转储(如java),内存转储或其他东西,这可能有助于事后分析?也许一些内置的.NET框架工具可以提供帮助吗?

我对真实的项目经验以及如何解决这个维护问题非常感兴趣,我认为这对大多数程序员来说都是非常真实的.

.net c# maintenance

5
推荐指数
0
解决办法
436
查看次数

Java中的字符串:equals vs ==

可能重复:
如何比较Java中的字符串?

  String s1 = "andrei";
  String s2 = "andrei";

  String s3 = s2.toString();

  System.out.println((s1==s2) + " " + (s2==s3));
Run Code Online (Sandbox Code Playgroud)

给出以下代码为什么第二个比较s2 == s3为真?实际上s2.toString()返回的是什么?实际位于何处(s2.toString())

java string reference

5
推荐指数
3
解决办法
2427
查看次数

什么时候在.Net代码中手动实习字符串是个好主意?

参考资料如下:http: //msdn.microsoft.com/en-us/library/system.string.intern.aspx

看起来这是由编译器自动完成的,但也可以手动完成.如果我错了,请纠正我,并对此有所了解.语言是C#,VB.Net,C++/CLI,还是其他?

谢谢.

.net premature-optimization string-interning

4
推荐指数
1
解决办法
218
查看次数

为什么字符串指针位置不同?

为什么每次运行应用程序时字符串指针的位置都不同,当我使用StringBuilder时,当我声明变量时,它是相同的?

void Main()
{
    string str_01 = "my string";
    string str_02 = GetString();
    unsafe 
    {
        fixed (char* pointerToStr_01 = str_01)
        {
            fixed (char* pointerToStr_02 = str_02)
            {
                Console.WriteLine((Int64)pointerToStr_01);
                Console.WriteLine((Int64)pointerToStr_02);
            }
        }
    }
}

private string GetString()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("my string");

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

输出:

40907812
178488268

下次:

40907812
179023248

下次:

40907812
178448964

c# pointers unsafe-pointers string-interning

4
推荐指数
1
解决办法
364
查看次数

String.Intern和String.IsInterned有什么区别?

MSDN声明

String.Intern检索系统对指定String的引用

String.IsInterned检索对指定String的引用.

我认为IsInterned应该返回(我知道它没有)一个bool,说明指定的字符串是否被实现.这是正确的想法吗?我的意思是它至少与.net框架命名约定不一致.

我写了以下代码:

    string s = "PK";
    string k = "PK";

    Console.WriteLine("s has hashcode " + s.GetHashCode());
    Console.WriteLine("k has hashcode " + k.GetHashCode());
    Console.WriteLine("PK Interned " + string.Intern("PK"));
    Console.WriteLine("PK IsInterned " + string.IsInterned("PK"));
Run Code Online (Sandbox Code Playgroud)

输出是:

s有哈希码-837830672

k有哈希码-837830672

PK Interned PK

PK IsInterned PK

为什么string.IsInterned("PK")返回"PK"?

.net c# string

3
推荐指数
1
解决办法
2751
查看次数

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