我有一个应用程序,随着时间的推移创建了很多线程.我注意到内存使用量在运行时会增加并最终耗尽内存.但是同样的代码不会泄漏我同事环境中的内存.我们都有相同的.net版本.我能够使用以下示例代码重现该问题,该代码不会在我的同事的笔记本电脑上泄漏,而是在我的笔记本电脑上泄露.
public static void Main(string[] args)
{
Console.WriteLine("Version " + Environment.Version.ToString());
if (Environment.Is64BitProcess)
Console.WriteLine("64");
else
Console.WriteLine("32");
while(true)
{
Thread t = new Thread(() => { Thread.Sleep(1); });
t.IsBackground = true;
t.Start();
Thread.Sleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的内容时,会打印以下内容
Version 4.0.30319.18063
32
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2012中,项目的目标框架是.net framework 4.5.项目使用以下配置泄漏内存
Project Properties -> Build
Platform target: Any CPU
Prefer 32-bit: checked
Run Code Online (Sandbox Code Playgroud)
如果我取消选中Prefer 32-bit,它不会泄漏.
泄漏内存的另一种配置是
Project Properties -> Build
Platform target: x86
Prefer 32-bit: disabled
Run Code Online (Sandbox Code Playgroud)
由此产生的可执行文件泄露在我的笔记本电脑上并没有泄漏在我的同事的笔记本电脑上.
我使用CLR Profiler来查找内存泄漏,但它没有显示任何泄漏.但我确实看到Windows资源监视器中的工作集增加了大约1 MB /秒.
是什么导致我的环境中的32位模式的内存使用量增加,而不是我的同事?
我创建了一个名为"test_isolation"的数据库,并创建了一个包含数据的表'person'
name age
---- ---
test1 1
test2 2
test3 3
test4 4
test5 5
test6 6
Run Code Online (Sandbox Code Playgroud)
现在,数据库已更改为允许在session1中进行快照隔离
ALTER DATABASE test_isolation
SET ALLOW_SNAPSHOT_ISOLATION ON
GO
Run Code Online (Sandbox Code Playgroud)
现在我在会话2中创建一个事务
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRAN
SELECT * FROM PERSON
GO
DELETE FROM PERSON WHERE name = 'test6'
GO
SELECT * FROM PERSON
GO
Run Code Online (Sandbox Code Playgroud)
结果如预期.(注意我们还没有提交此交易!)
现在我在会话3中执行以下查询
SELECT * FROM PERSON
Run Code Online (Sandbox Code Playgroud)
会话3中的查询继续无限运行,这意味着表被锁定.
如果我回到会话2并提交事务..我能在会议3运行查询和结果符合预期.
事务隔离级别SNAPSHOT不应该锁定表吗?我做错了什么或者我对交易SNAPSHOT隔离的理解是错误的?
请帮忙..