ASP.NET的内存泄漏 - OracleCommand对象 [英] ASP.NET Memory Leak - OracleCommand Object

查看:169
本文介绍了ASP.NET的内存泄漏 - OracleCommand对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有内存泄漏,我有一个很艰难的时期试图找出问题的所在。 ASP.NET进程正在提高至1GB飘飞。我按照这个页面上的说明!(HTTP://humble$c$cr.co.uk/tag/windbg)和gcroot命令返回以下(最后x行)。我已经看过我所有的OracleConnections和OracleCommands,他们似乎是正确关闭和处置:

  6523dfd4 282 28200 System.Data.SqlClient.SqlParameter
    0e90d850 548 28496 System.IO.MemoryStream
    67b71a0c 1461 29220 System.Transactions.SafeIUnknown
    1924年7a5ee588 30784 System.Collections.Specialized.ListDictionary + NodeKeyValueCollection
    648c91f4 665 31920 System.Configuration.ConfigurationValues
    7a5e5d04 1342 32208 System.Threading.Semaphore
    652410f8 670 34840 System.Data.ProviderBase.DbConnectionPool + PoolWaitHandles
    6613228c 1319 36932 System.Web.Security.FileSecurityDescriptorWrapper
    66106948 2449 39184 System.Web.UI.AttributeCollection
    0e8ff780 2021 40420 Microsoft.Win32.SafeHandles.SafeLsaPolicyHandle
    01e34730 336 43008 Oracle.DataAccess.Client.OracleDataReader
    648c9434 2218 44360 System.Configuration.ConfigurationValue
    1918年7a5ea0e4 46032 System.Collections.Specialized.ListDictionary + NodeKeyValueCollection + NodeKeyValueEnumerator
    7a5eaaa8 3088 49408 System.Collections.Specialized.NameObjectCollectionBase + NameObjectEntry
    652435c4 1138 59176 System.Data.SqlClient.SqlBuffer
    0e912c9c 2491 59784 System.Collections.ArrayList
    0e9132c0 1236 69216 System.Collections.Hashtable
    6614bf64 45 69660 System.Web.Caching.ExpiresEntry []
    0e8ff7d8 4042 80840 Microsoft.Win32.SafeHandles.SafeLsaMemoryHandle
    66105ff4 5434 86944 System.Web.UI.StateBag
    01e364c8 5686 90976 Oracle.DataAccess.Client.OpoSqlValTimeoutCtx
    0e912e08 1007 91556 System.Int32 []
    7a5ee300 3942 94608 System.Collections.Specialized.ListDictionary + NodeEnumerator
    01e35ef8 7918 95016 Oracle.DataAccess.Client.OpoSqlRefCtx
    01e353bc 6043 96688 Oracle.DataAccess.Client.MetaData
    0e8f83e8 5017 100340 Microsoft.Win32.SafeHandles.SafeLocalAllocHandle
    7a5ef738 6284 125680 System.Collections.Specialized.HybridDictionary
    7a5ef7f4 5143 144004 System.Collections.Specialized.ListDictionary
    661060d0 10908 174528 System.Web.UI.StateItem
    0e91189c 533 184492 System.Char []
    6610d15c 2426 203784 System.Web.UI.WebControls.TableCell
    01e362ec 7918 221704 Oracle.DataAccess.Client.OracleXmlQueryProperties
    7a5ef8b4 11231 224620 System.Collections.Specialized.ListDictionary + DictionaryNode
    65242390 1814 232192 System.Data.SqlClient._SqlMetaData
    0e8f832c 12124 242480 Microsoft.Win32.SafeHandles.SafeTokenHandle
    01e36444 7918 253376 Oracle.DataAccess.Client.OracleXmlSaveProperties
    0e8f7ca8 13​​394 267880 Microsoft.Win32.SafeHandles.SafeWaitHandle
    0e9133bc 1255 267912 System.Collections.Hashtable +斗[]
    0e8f7a98 12048 289152 System.Threading.ManualResetEvent
    0e8e443c 7886 385508 System.Object的[]
    01e34b60 6456 387360 Oracle.DataAccess.Client.OpoConRefCtx
    01e33860 6432 668928 Oracle.DataAccess.Client.OracleConnection
    01e34f9c 6439 824192 Oracle.DataAccess.Client.OpoConCtx
    01e34038 7918 1171864 Oracle.DataAccess.Client.OracleCommand
    000dfbe0 70 5839608免费
    0e9136dc 2622 17492932 System.Byte []
    0e910c6c 56049 19472876 System.String
    共有283875对象


解决方案

如果内存使用一段时间后,下降到200 MB,这说明你的内存beeing收集,但你仍然可能有内存missuse问题。
这个转储不显示了很多,但如果拍摄时的过程是1GB如你所说,你仍然可以使用它:
1)使用!gcroot在几个对象,看看他们是如何连接到内存(我会检查数据库的使用,看来你有大量的Oracle连接的(6432)左右浮动,与很多其他DB的东西。)
像这样的:

  dumpheap -MT<!MT =最左边的数字>

对象将显示内存地址

  gcroot<!地址>

的对象堆栈将显示在显示对象如何连接到存储器树。
<一href=\"http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx\"相对=nofollow>这个过程中的一个样本

2)检查性能计数器(开始 - >运行 - >性能监视器)添加这些计数器:
  - .NET CLR内存 - > #bytes所有堆
  - 流程 - >专用字节
计算它们之间的差 - 这是由非托管资源消耗的存储器(例如数据库客户对象)
检查这在低内存和高内存情况下,你会看到,如果内存的消耗主要是由于管理的内存(堆全部)或非托管。
3)如果内存非托管的,它仍然可能被管理对象举行,作为主应用程序进行管理,你与他们完成后键,以便确保您免费非托管资源。 (接近DBConnections,处置DBCommands,关闭文件句柄,免费COMObjects等)

希望这有助于
             阿米特。

I have a memory leak and I am having a really hard time trying to figure out where the problem is. The ASP.NET process is raising to 1GB every now and then. I have followed the instructions on this page (http://humblecoder.co.uk/tag/windbg) and the !gcroot command returns the following (last x lines). I have looked at all my OracleConnections and OracleCommands and they appear to be closed and disposed correctly:

   6523dfd4      282        28200 System.Data.SqlClient.SqlParameter
    0e90d850      548        28496 System.IO.MemoryStream
    67b71a0c     1461        29220 System.Transactions.SafeIUnknown
    7a5ee588     1924        30784 System.Collections.Specialized.ListDictionary+NodeKeyValueCollection
    648c91f4      665        31920 System.Configuration.ConfigurationValues
    7a5e5d04     1342        32208 System.Threading.Semaphore
    652410f8      670        34840 System.Data.ProviderBase.DbConnectionPool+PoolWaitHandles
    6613228c     1319        36932 System.Web.Security.FileSecurityDescriptorWrapper
    66106948     2449        39184 System.Web.UI.AttributeCollection
    0e8ff780     2021        40420 Microsoft.Win32.SafeHandles.SafeLsaPolicyHandle
    01e34730      336        43008 Oracle.DataAccess.Client.OracleDataReader
    648c9434     2218        44360 System.Configuration.ConfigurationValue
    7a5ea0e4     1918        46032 System.Collections.Specialized.ListDictionary+NodeKeyValueCollection+NodeKeyValueEnumerator
    7a5eaaa8     3088        49408 System.Collections.Specialized.NameObjectCollectionBase+NameObjectEntry
    652435c4     1138        59176 System.Data.SqlClient.SqlBuffer
    0e912c9c     2491        59784 System.Collections.ArrayList
    0e9132c0     1236        69216 System.Collections.Hashtable
    6614bf64       45        69660 System.Web.Caching.ExpiresEntry[]
    0e8ff7d8     4042        80840 Microsoft.Win32.SafeHandles.SafeLsaMemoryHandle
    66105ff4     5434        86944 System.Web.UI.StateBag
    01e364c8     5686        90976 Oracle.DataAccess.Client.OpoSqlValTimeoutCtx
    0e912e08     1007        91556 System.Int32[]
    7a5ee300     3942        94608 System.Collections.Specialized.ListDictionary+NodeEnumerator
    01e35ef8     7918        95016 Oracle.DataAccess.Client.OpoSqlRefCtx
    01e353bc     6043        96688 Oracle.DataAccess.Client.MetaData
    0e8f83e8     5017       100340 Microsoft.Win32.SafeHandles.SafeLocalAllocHandle
    7a5ef738     6284       125680 System.Collections.Specialized.HybridDictionary
    7a5ef7f4     5143       144004 System.Collections.Specialized.ListDictionary
    661060d0    10908       174528 System.Web.UI.StateItem
    0e91189c      533       184492 System.Char[]
    6610d15c     2426       203784 System.Web.UI.WebControls.TableCell
    01e362ec     7918       221704 Oracle.DataAccess.Client.OracleXmlQueryProperties
    7a5ef8b4    11231       224620 System.Collections.Specialized.ListDictionary+DictionaryNode
    65242390     1814       232192 System.Data.SqlClient._SqlMetaData
    0e8f832c    12124       242480 Microsoft.Win32.SafeHandles.SafeTokenHandle
    01e36444     7918       253376 Oracle.DataAccess.Client.OracleXmlSaveProperties
    0e8f7ca8    13394       267880 Microsoft.Win32.SafeHandles.SafeWaitHandle
    0e9133bc     1255       267912 System.Collections.Hashtable+bucket[]
    0e8f7a98    12048       289152 System.Threading.ManualResetEvent
    0e8e443c     7886       385508 System.Object[]
    01e34b60     6456       387360 Oracle.DataAccess.Client.OpoConRefCtx
    01e33860     6432       668928 Oracle.DataAccess.Client.OracleConnection
    01e34f9c     6439       824192 Oracle.DataAccess.Client.OpoConCtx
    01e34038     7918      1171864 Oracle.DataAccess.Client.OracleCommand
    000dfbe0       70      5839608      Free
    0e9136dc     2622     17492932 System.Byte[]
    0e910c6c    56049     19472876 System.String
    Total 283875 objects

解决方案

If mem usage drops to 200 MB after a time, this shows your memory is beeing collected, but you still might have a memory missuse issue. this dump doesn't show alot, but if it was taken when the process is 1GB as you said, you can still use it: 1) use !gcroot on several objects, to see how they are attached to the memory (i would check the DB usage, it seems you have a large amount of oracle connections (6432), and alot of other DB stuff floating around.) like this:

!dumpheap -MT <mt = the left most number>

objects will show with memory addresses

!gcroot <address>

an object stack will show displaying how the object is attached to the memory tree. a sample of this process

2) check performance counters (start->run->perfmon) add these counters: - .Net Clr Memory-> #bytes all heaps - Process->private bytes calculate the difference between them - this is the memory consumed by unmanaged resources (like DB client objects) check this in low memory and in high memory scenarios, and you will see if the memory consumption is mostly due to Managed memory (all heaps) or unmanaged. 3) if the memory is unmanaged, it's still likely to be held by managed objects, as the main application is managed, so making sure you free unmanaged resources after you are done with them is key. (close DBConnections, dispose DBCommands, close file handles, free COMObjects etc.)

Hope this helps, Amit.

这篇关于ASP.NET的内存泄漏 - OracleCommand对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆