System pretends to be out of memory when it isn't

W

Wowbagger

XP SP2 on a P-4 at 2.4 GHz and 1Gb of RAM.

The system is usually quite zippy but after several hours of use the system
will slow down and act as if it is running out of memory - new windows won't
open unless I close existing windows, can't copy/paste to or from the
clipboard unless I close more applications and the like. Performance
monitor shows low CPU usage - around 5-20% depending on exactly what I am
doing and available physical memory usually shows 256-512Mb and the commit
charge typically running about 1/2 of the limit (peak is usually less than
1/2 of the limit as well). A simple reboot and all is well once again for
another several hours.

There is no pattern to the "running out of resources" behavior. Despite
frequent scans for virus, worm or trojan activity nothing has ever been
found. Norton Antivirus, MS AntiSpyware, Spybot, Hijack This!, TrendMicro,
Panda and a few others have all been used and came up with exactly nothing.
I've tracked CPU usage, disk i/o, memory usage, swap activity, network i/o
and nothing indicates what is eating up the resources.

Could somebody please throw a few ideas my way? I've run out of ideas on
where to look for the problem. What performance monitors should I try
watching? I can't even tell where the bottlenecks are.

Software run on the system:
MS Office 2003
Norton AntiVirus 2005
Firefox
MSIE
GAIM
MS Streets & Trips 2005
Google Desktop Search
MS AntiSpyware
GoToMyPC
MusicMatch Jukebox (suspected this one first, but couldn't demonstrate a
link)
 
A

Alias

Wowbagger said:
XP SP2 on a P-4 at 2.4 GHz and 1Gb of RAM.

The system is usually quite zippy but after several hours of use the system
will slow down and act as if it is running out of memory - new windows won't
open unless I close existing windows, can't copy/paste to or from the
clipboard unless I close more applications and the like. Performance
monitor shows low CPU usage - around 5-20% depending on exactly what I am
doing and available physical memory usually shows 256-512Mb and the commit
charge typically running about 1/2 of the limit (peak is usually less than
1/2 of the limit as well). A simple reboot and all is well once again for
another several hours.

There is no pattern to the "running out of resources" behavior. Despite
frequent scans for virus, worm or trojan activity nothing has ever been
found. Norton Antivirus, MS AntiSpyware, Spybot, Hijack This!, TrendMicro,
Panda and a few others have all been used and came up with exactly nothing.
I've tracked CPU usage, disk i/o, memory usage, swap activity, network i/o
and nothing indicates what is eating up the resources.

Could somebody please throw a few ideas my way? I've run out of ideas on
where to look for the problem. What performance monitors should I try
watching? I can't even tell where the bottlenecks are.

Software run on the system:
MS Office 2003
Norton AntiVirus 2005
Firefox
MSIE
GAIM
MS Streets & Trips 2005
Google Desktop Search
MS AntiSpyware
GoToMyPC
MusicMatch Jukebox (suspected this one first, but couldn't demonstrate a
link)

Two things:

1. When was the last time you cleaned up your computer? I mean, emptying
temp files, caches, etc. Get ccleaner at www.ccleaner.com and clean up
your machine.

2. Get rid of Norton, the sooner, the better. If you want to pay for an
AV, get TrendMicro, NOD32 or Kapersky (sp?). If you want a free AV, get
Avast! at www.avast.com

Alias
 
W

Wowbagger

Two things:

1. When was the last time you cleaned up your computer? I mean, emptying
temp files, caches, etc. Get ccleaner at www.ccleaner.com and clean up
your machine.

I've done it a couple of times across the many months that I've been
noticing the problem. Never helps.
2. Get rid of Norton, the sooner, the better. If you want to pay for an
AV, get TrendMicro, NOD32 or Kapersky (sp?). If you want a free AV, get
Avast! at www.avast.com

Office environment - norton is what I have to work with. The other dozenish
machines are also running norton and don't have the problem (though I'm the
only power user here). All of the machines are similar in specs - along the
lines of Dell 2400s. The only significant difference between the machines
is that mine has a gig of ram and the others are either 256 or 512.
 
W

Wowbagger

Yes - a static swap of 1 Gb located on C: (the only HDD in the system). No
fragments - the swap was deleted, the system defragged twice then the swap
recreated into a single chunk. The behavior was identical both before and
after this operation several months ago. A dynamic swap file was originally
used but my heavy disk usage quickly fragmented it to shreds.

"David Candy" <.> wrote in message
Do you have a swap file?
 
D

David Candy

Swap files don't care about fragmentation. It is not slower or faster as they are accesssed by disk location not as a file and nor are they sequential. However the more fragments the more memory used to track the fragments. We've only seen one person here who had a problem with this (tens of thousands of fragments), 2, 3, 50, 100 fragments is irrelevent.

All your symptoms are of a computer with no more memory to allocate. Make the swap 2 gig (don't defrag - not worth it) and see if that helps.

See other resources, like registry (size or handles), what programs do you run, is one asking for it's full 2 gigs of address space?
 
W

Wowbagger

Nothing seems to be asking for the full 2Gb. Perfmon usually shows handles
in the 16,000 - 18,000 range if the system is bogging down or not. The
application list is at the bottom of this post - the only other thing I ever
use is paint.net


"David Candy" <.> wrote in message
Swap files don't care about fragmentation. It is not slower or faster as
they are accesssed by disk location not as a file and nor are they
sequential. However the more fragments the more memory used to track the
fragments. We've only seen one person here who had a problem with this (tens
of thousands of fragments), 2, 3, 50, 100 fragments is irrelevent.

All your symptoms are of a computer with no more memory to allocate. Make
the swap 2 gig (don't defrag - not worth it) and see if that helps.

See other resources, like registry (size or handles), what programs do you
run, is one asking for it's full 2 gigs of address space?
 
W

Wowbagger

At the very bottom:

"David Candy" <.> wrote in message
application list is at the bottom of this post ??????????????????
 
D

David Candy

I thought of things all day, researched this and that, but nothing seems likely.

I'd try clean boot troubleshooting - type it in Help while online.
 
W

Wowbagger

Yeah... I'd thought of that too, but the problem with that is that I'd have
to wait hours (sometimes days) before it shows up. I'm thinking there is a
major memory leak somewhere - MS Streets & Trips is my first suspect - but I
don't know how to go about getting proof.

"David Candy" <.> wrote in message
I thought of things all day, researched this and that, but nothing seems
likely.

I'd try clean boot troubleshooting - type it in Help while online.
 
D

David Candy

It was one thing I was looking at earlier

Umdhtools.exe: How to Use Umdh.exe to Find Memory Leaks

Q268343


--------------------------------------------------------------------------------
The information in this article applies to:

a.. Microsoft Windows 2000 Advanced Server
b.. Microsoft Windows 2000 Server
c.. Microsoft Windows 2000 Professional
d.. Microsoft Windows NT Server version 4.0
e.. Microsoft Windows NT Workstation version 4.0

--------------------------------------------------------------------------------


SUMMARY
The user-mode dump heap (UMDH) utility works with the operating system to analyze Windows heap allocations for a specific process. This utility, and the other tools associated with it, are primarily targeted for Windows 2000. However, a Umdh_nt4.exe application, and the Dbghelp.dll which is not available on Windows NT, have been supplied for use under Windows NT version 4.0 Service Pack 6 (SP6). This article discusses how you can use UMDH to help locate memory leak problems. A self-extracting executable is included that contains the following tools:

a.. Umdh.exe- This utility is used to dump the heap allocation information for a process.


b.. Umdh_nt4.exe and Dbghelp.dll - This is the Windows NT 4.0 SP6 version of the UMDH tool.


c.. Gflags.exe- This utility sets the appropriate registry entries for the application that will be analyzed. The operating system looks at the registry entries to determine if an application's heap allocations will be tracked.


d.. Tlist.exe - This application lists all of the processes running on a machine and all of their related process IDs.


e.. Dhcmp.exe - This tool is used to compare two UMDH dumps to determine where a possible memory leak is occurring.


f.. Dhcmpgui.zip - This tool also compares two UMDH logs but has a user interface to make it easier to retrieve information. The .zip file contains the Dhcmpgui.exe file and its source code.





MORE INFORMATION
The following file is available for download from the Microsoft Download Center:



Umdhtools.exe
Release Date: Feb. 5, 2001

For additional information about how to download Microsoft Support files, click the article number below to view the article in the Microsoft Knowledge Base:
Q119591 How to Obtain Microsoft Support Files from Online Services
Microsoft used the most current virus detection software available on the date of posting to scan this file for viruses. Once posted, the file is housed on secure servers that prevent any unauthorized changes to the file.


Before Using UMDH
If you think you are experiencing a memory leak, please be aware that memory leaks may not be what they appear to be. You may discover that a memory leak is really not a memory leak but a performance enhancement. For example, the Microsoft Jet database engine can consume large amounts of memory (up to 128 MB on a 256-MB computer) for its data retrieval and writing caches. The cache allows the Jet engine to achieve fast read-ahead and write-ahead buffering.

To determine whether or not a process is experiencing memory leaks, use Windows Performance Monitor (Perfmon.exe) and monitor "Private Bytes" under the Process category for your application. Privates Bytes is the total amount of memory the process has allocated but is not sharing with other processes. Note that this is different from "Virtual Bytes," which is also interesting to monitor. Virtual Bytes is the current size in bytes of the virtual address space the process is using. An application can leak virtual memory but not see a difference in the amount of private bytes allocated. If you don't see memory rising when monitoring private bytes but suspect that you are still running out of memory, you should monitor virtual bytes to see if you are exhausting virtual memory.

Review the following MSDN article titled "Finding Leaks and Bottlenecks with a Windows NT PerfMon COM Object" for more information about detecting memory leaks:
http://msdn.microsoft.com/library/techart/perfmon.htm
To be certain your application is leaking memory, you should place the suspect code in a loop with many iterations, and monitor private and virtual bytes for any increases of memory. Watch to make certain that the number of private bytes and virtual bytes doesn't eventually stay the same and stops rising. If there is a point at which the memory stops rising, that is, it does not continue to climb indefinitely, you are not seeing a memory leak but are probably seeing some cache that is growing to its maximum size.
Capturing Heap Dumps with UMDH
UMDH (or Umdh_nt4.exe if you are using Windows NT 4.0 SP6) is a tool that dumps information about a process's heap allocations. This information includes the callstack for each allocation, the number of allocations made through that callstack, and the number of bytes consumed through that callstack. For example:

00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D This UMDH output shows that there were 21280 (0x5320) bytes allocated total from the callstack. The 21280 bytes were allocated from 20 (0x14) separate allocations of 1064 bytes (0x428). The callstack is given a identifier of BackTrace00053.

To produce a dump of the heap allocations, you must first let the operating system know that you would like the kernel to track the allocations. This is done by using the Gflags.exe utility.

Let's assume that you want to dump the heap contents for Notepad.exe. By the way, most processes have more than one heap active and the UMDH log will contain all of them. First you need to enable stack trace acquisition for the application you want to test. This feature is not enabled by default. The command to enable it is:
gflags -i notepad.exe +ust
The command does not enable stack tracing for processes that are already running, but all future executions of Notepad.exe will have it enabled. Alternatively, you can set the flag through the GFLAGS user interface (run Gflags.exe without any arguments to get the user interface). Before using UMDH, you also need to install the correct debug symbols for the components of your application as well as the operating system. Typically, the operating system symbols are installed in the SYMBOLS folder on the WINNT folder. UMDH attempts to find the symbol files by using the _NT_SYMBOL_PATH. The command for setting the path from a command prompt is:
set _NT_SYMBOL_PATH=%windir%\symbols
For more information about setting up symbolic debugging information, see the "Debug Symbols" section later in this article.

With the image flags set and the symbols installed, you are ready to start Notepad. After the program is started, you need to determine the Process ID (PID) of the Notepad process just started. The command for this is:
tlist
You can find the PID from the output of the TLIST application. The PID information can also be obtained from Task Manager. Let's assume the PID for the Notepad process you just started is 124. You can use UMDH to get a heap dump by using the following command:
umdh -p:124 -f:notepad124.log
Results: You've got a complete heap dump of the Notepad process in the Notepad124.log file.
Using Dhcmp.exe to Compare UMDH Logs
While the UMDH log file contains valuable information about the current state of the heaps for a process, if you are concerned with finding a memory leak, it may be more valuable to compare the outputs of two logs and find out what callstack has seen the largest growth between the two dumps. The Dhcmp.exe utility helps compare two UMDH logs to provide an analysis of the difference between them. Once you have two logs captured at different intervals, you can then use the following command:
DHCMP dh1.log dh2.log > cmp12.txt
The .txt files will compare the effect on memory of running the suspect memory hog application. The output of the file generated by DHCMP resembles the following:

+ 5320 ( f110 - 9df0) 3a allocs BackTrace00053
Total increase == 5320 For each BackTrace in the UMDH log files, there is a comparison made between the two logs files. This case shows that the last log file specified in the DHCMP command line had F110 bytes allocated while the first log in the DHCMP command line had 9DF0 bytes allocated for the same BackTrace (callstack). The 5320 is the difference in the number of bytes allocated. In this case, there were 5320 more bytes allocated between the time the two logs were captured. The bytes came from the callstack identified by BackTrace00053.

The next step is to find out what's in that backtrace. If you open the second DH log file and search for "BackTrace00053" you might find something that resembles the following:

00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D By looking at the callstack, you can see that the LeakyFunc function is allocating memory by way of the Visual C++ run-time library. If you find that the number of allocations grows as you took more dumps, you might be able to conclude that memory is not being freed.
Enabling Stack Traces
The most important information in UMDH logs is the stack traces of the heap allocations. By analyzing them it can be understood whether a process leaks heap memory. These stack traces are not acquired by default. The feature can be enabled per-process or system-wide. Use the following command to enable stack tracing system-wide:
gflags -r +ust
Restart the computer after this command.

For per-process enabling, the command is
gflags -i APPNAME +ust
Where APPNAME is the file name of the executable including the extension (Services.exe, lsass.exe, and so on). The command will not enable stack tracing for a process that is already running. For this reason, in the case of processes that can't be restarted (services, lsass, winlogon), the test compute must be restarted.

Use the following commands to verify what settings have been set system-wide or for a specific process:

System-wide:
gflags -r
Specific process:
gflags -i APP-NAME
By default, the maximum stack trace depth is 16. If you want to see deeper callstacks, you can increase this by running GFLAGS. Click to select System Registry and type a new depth in the Max. Stack Trace Capture Depth edit control. Click Apply, and then restart the computer.

IMPORTANT: If you are using Windows NT 4.0 Service Pack 6, you must use Umdh_nt4.exe, rather than Umdh.exe, and you must use the above command to set system-wide stack tracing. Be certain to reboot. Umdh_nt4 stack tracing does not work on a per process basis on Windows NT version 4. It must be set for the entire system.
Debug Symbols
UMDH uses the IMAGEHLP library for symbol manipulation. This is the standard tool for such tasks and it is also used by Microsoft debuggers. One of the most important steps to using UMDH is to ensure that you have good symbol files (.dbg or .pdb file) to get a good stack trace. The debug symbol files can be installed from the Windows NT CD, or in the case of Microsoft Windows 2000, from the Windows 2000 Support Tools CD. At a minimum, you need the Kernel32.dbg and Ntdll.dbg symbol files. You can always acquire additional debugging symbols as needed as you find out more about which components are leaking the memory.

When building components with Visual C++, it is important that you not have Program Database for Edit and Continue selected for the C++ compiler options. Instead, select Program Database.

To set the symbol path, initialize the _NT_SYMBOL_PATH environment variable to the path to be used. This can be done once when the test computer is set up by using the System application in Control Panel (Advanced, Environment Variables) or inside a command window before UMDH is run. Usually the symbols are copied to the test machine in the %windir%\Symbols folder. In this case, use the following command to set the variable:
set _NT_SYMBOL_PATH=%windir%\symbols
NOTE: Include the path to the PDBs for your application's components as well.
Invoking UMDH
The only required command-line parameter for UMDH is the -p option, which specifies the PID of the process from which a heap dump will be obtained. The PID can be obtained by using Task Manager or the Tlist.exe program. For a command similar to the following, the log will be dumped to the standard output:
umdh -p:pID
UMDH also displays various informational messages to standard error, and therefore if not redirected it will be mixed with the real log. To gather the UMDH informational messages in a file, use the following command:
umdh -p:pID 2>umdh.msg
If you want to gather the log dumped by UMDH in a file, use one of the following commands:
umdh -p:pID >umdh.log
-or-

umdh -p:pID -f:umdh.log
The commands are completely equivalent.

The default log obtained by UMDH contains an enumeration of heap consumers sorted by allocation count. If, for debugging purposes, you also need a dump of all allocated blocks with their corresponding stack traces, the -d option must be used:
umdh -p:pID -d
If the log contains too much information, it can be limited only to big users that have the allocation count above a certain threshold. Use the following command:
umdh -p:pID -t:THRESHOLD
All the command-line options (-p, -f, -t, -d) can be specified simultaneously in any order. Following is a complicated command-line example:
umdh -p:123 -t:1000 -f:umdh.log -d
This command dumps the heaps for the process with PID 123 into the Umdh.log file. It dumps only stack traces that account for more than 1000 allocations and it also dumps the addresses of the heap blocks allocated through each stack trace.
UMDH Output Explained
If you redirected the log to a file (umdh -p:pID -f:umdh.log), the contents will resemble the following, which was obtained from a running Notepad process:

UMDH: Logtime 2000-06-28 10:54 - Machine=MYMachine - PID=704
*********** Heap 00270000 Information ********************
Flags: 58000062
Number Of Entries: 87
Number Of Tags: <unknown>
Bytes Allocated: 00008DF0
Bytes Committed: 0000A000
Total FreeSpace: 00001210
Number of Virtual Address chunks used: 1
Address Space Used: <unknown>
Entry Overhead: 8
Creator: (Backtrace00007)
ntdll!RtlDebugCreateHeap+0x00000196
ntdll!RtlCreateHeap+0x0000023F
ntdll!LdrpInitializeProcess+0x00000369
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007
*********** Heap 00270000 Hogs ********************
000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00031
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007

000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00034
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007 The log contains a dump of every heap in the process. In this example, the log starts with a heap at address 270000. After a few global counters for the heap, the log contains a dump in decreasing sorted order of stack traces that are responsible for the most allocations. By comparing the dynamics of memory used at different moments you can deduce what happened in the process and if any heap use looks like a leak.
Problems That Can Be Encountered When Using UMDH
The most common errors when using UMDH are not having stack tracing enabled. Incorrect symbols for Ntdll.dll prevent UMDH from running. For the other symbols files, UMDH will run but the log file will contain stack traces that do not have function names but instead have relative addresses inside modules. A distant third error is specifying a wrong PID. The following error message results when you attempt to run UMDH for a process that does not have stack tracing enabled:
C:\>umdh -p:1140
UMDH: Logtime 2000-06-28 12:43 - Machine=MyMachine - PID=1140
Connecting.....Module enumeration complete.
SymGetSymFromName(process, ntdll!RtlpStackTraceDataBase, xxx) failed, LastError = 126
UmdhGetAddrFromName couldn't find Stack Trace DB pointer (ntdll!RtlpStackTraceDataBase).
ntdll.dll symbols are incorrect; we must be able to see non-import symbols.
Use the following command to double-check the settings for the process you are investigating:
gflags -i APPNAME
Use the following command in the case where you are relying on system-wide stack tracing:
gflags -r
These commands show the list of flags set for the application. Note that in the case of system-wide stack tracing, the feature might appear as active but if you did not restart the computer after running the gflags -r +ust command, it is not actually activated. If you want to know every application that has stack tracing enabled, you can look at the USTEnabled key under the following registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
If you run UMDH on a process that has stack tracing enabled but have not restarted the application since setting the flags, you may get the following message in your logs:
A stack trace was not saved for this allocation (Index == 0)
If you run UMDH without setting the correct symbol path or the symbols are incorrect, you may get an error message in the log. However, you may just get incorrect or misleading callstacks. To verify whether you have the correct symbols, launch the NTSD system debugger for a process, for example:
ntsd notepad
Then, from the debugger console, run the LD command to load the symbol information for the module and the LM command to list what modules have their symbols loaded. If the output of the LM command shows export symbols loaded, the symbols are not good. If you have PDB symbols loaded, the symbols are good. You may get the following error message if you specified the wrong PID:
C:\>umdh -p:1000
UMDH: Logtime 2000-06-28 09:45 - Machine=MyMachine - PID=1000
Connecting...
OpenProcess failed, LastError = 0x57

Additional Tools
Using DHCMPGUI
The Dhcmpgui.exe tool can be used to compare two UMDH logs. This tool is located in the Dhcmpgui.zip file. It calls out to Dhcmp.exe (make certain that you have this in your PATH). Click File 1 and File 2 to specify the two UMDH logs to compare.

After selecting the two files to compare, you will see a list of the differences. The columns listed are the number of bytes allocated, number of allocations, and the BackTraceID, respectively. You can sort by any one of those columns by clicking the appropriate button, and then clicking Sort. To see the BackTrace (callstack) for any line, just double-click it. This provides an easy way to compare two logs and to quickly get to the callstack for the callstack that is leaking memory.

The source code has been provided for Dhcmpgui.exe in case you want to make any modifications. The project requires Visual C++ version 6.0.
Calling UMDH from Visual Basic
There may be times when it is useful to dump a number of logs over time because the leak may not be very noticeable at first. For example, suppose you suspect that your ASP application is leaking memory. It may be helpful to write a COM component in Visual Basic that shells out to UMDH. You can then call that component from your ASP page.

Following is some Visual Basic code that invokes UMDH and creates a log file based on the current time:


Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Function GetProcessID()
GetProcessID = GetCurrentProcessId()
End Function
..
..
..
Dim strTime As String

Dim sProcID As String
sProcID = GetProcessID()
strTime = "MYLOG_" & Format(Now(), "hhmm")

Shell ("C:\UMDH\umdh -p:" & sProcID & " -f:d:\logs\" & strTime & ".txt")
Additional query words: DH umDHtools dumpheap displayheap

Keywords : kbfile kbsample kbOSWin2000 kbGrpDSVCDB kbDSupport kbgraphxlinkcritical
Issue type : kbhowto
Technology : kbWinNTsearch kbWinNTWsearch kbWinNTW400 kbWinNTW400search kbWinNT400xsearch kbwin2000AdvServ kbwin2000AdvServSearch kbwin2000Serv kbWinNTSsearch kbWinNTS400xsearch kbWinNTS400 kbwin2000ServSearch kbwin2000Search kbwin2000ProSearch kbwin2000Pro kbWinAdvServSearch


Last Reviewed: June 2, 2001
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.
 
R

R. McCarty

Using Perfmon.Msc, what does your CPU Interrupt count show ?
Also what, how many and which interface type are your disk drives ?
 
W

Wowbagger

The computer is showing the behavior at this moment:

Running applications: Outlook, Gaim, MusicMatch.

I was renaming photos on my desktop and copying them across the network to
the server. With 1Gb of memory I can usually copy dozens of photos
simultaneously without issue, but if I select more than a dozen or so the
cut/paste simply does not work. I clicked on the shortcut for Outlook
Express and am told that the application has moved or otherwise can't be
found. I close Outlook (2003) and the OE shortcut starts to work again.

I CTRL-ALT-DEL into task manager and have three tabs instead of the usual
four (the network tab is missing) and all three tabs - applications,
processes and performance are completely blank. I close music match and the
process tab but not the performance tabs is displaying properly, though some
of the text is weirdly flickering (I've never seen this before).

50 Processes
CPU Usage holding steady at 7%
Commit Charge: 384M / 2928M

I close down the google desktop search and the performance tab starts to
show.

Handles: 12235
Threads: 581
Processes: 46

Commit Charge (K)
Total 370640
Limit 2998464
Peak 742480

Physical Memory (K)
Total 1046528
Available 620988
System Cache 674284

Kernel Memory (K)
Total 85312
Paged 58656
Nonpaged 26656


"David Candy" <.> wrote in message
It was one thing I was looking at earlier

Umdhtools.exe: How to Use Umdh.exe to Find Memory Leaks

Q268343


--------------------------------------------------------------------------------
The information in this article applies to:

a.. Microsoft Windows 2000 Advanced Server
b.. Microsoft Windows 2000 Server
c.. Microsoft Windows 2000 Professional
d.. Microsoft Windows NT Server version 4.0
e.. Microsoft Windows NT Workstation version 4.0

--------------------------------------------------------------------------------


SUMMARY
The user-mode dump heap (UMDH) utility works with the operating system to
analyze Windows heap allocations for a specific process. This utility, and
the other tools associated with it, are primarily targeted for Windows 2000.
However, a Umdh_nt4.exe application, and the Dbghelp.dll which is not
available on Windows NT, have been supplied for use under Windows NT version
4.0 Service Pack 6 (SP6). This article discusses how you can use UMDH to
help locate memory leak problems. A self-extracting executable is included
that contains the following tools:

a.. Umdh.exe- This utility is used to dump the heap allocation information
for a process.


b.. Umdh_nt4.exe and Dbghelp.dll - This is the Windows NT 4.0 SP6 version
of the UMDH tool.


c.. Gflags.exe- This utility sets the appropriate registry entries for the
application that will be analyzed. The operating system looks at the
registry entries to determine if an application's heap allocations will be
tracked.


d.. Tlist.exe - This application lists all of the processes running on a
machine and all of their related process IDs.


e.. Dhcmp.exe - This tool is used to compare two UMDH dumps to determine
where a possible memory leak is occurring.


f.. Dhcmpgui.zip - This tool also compares two UMDH logs but has a user
interface to make it easier to retrieve information. The .zip file contains
the Dhcmpgui.exe file and its source code.





MORE INFORMATION
The following file is available for download from the Microsoft Download
Center:



Umdhtools.exe
Release Date: Feb. 5, 2001

For additional information about how to download Microsoft Support files,
click the article number below to view the article in the Microsoft
Knowledge Base:
Q119591 How to Obtain Microsoft Support Files from Online Services
Microsoft used the most current virus detection software available on the
date of posting to scan this file for viruses. Once posted, the file is
housed on secure servers that prevent any unauthorized changes to the file.


Before Using UMDH
If you think you are experiencing a memory leak, please be aware that memory
leaks may not be what they appear to be. You may discover that a memory leak
is really not a memory leak but a performance enhancement. For example, the
Microsoft Jet database engine can consume large amounts of memory (up to 128
MB on a 256-MB computer) for its data retrieval and writing caches. The
cache allows the Jet engine to achieve fast read-ahead and write-ahead
buffering.

To determine whether or not a process is experiencing memory leaks, use
Windows Performance Monitor (Perfmon.exe) and monitor "Private Bytes" under
the Process category for your application. Privates Bytes is the total
amount of memory the process has allocated but is not sharing with other
processes. Note that this is different from "Virtual Bytes," which is also
interesting to monitor. Virtual Bytes is the current size in bytes of the
virtual address space the process is using. An application can leak virtual
memory but not see a difference in the amount of private bytes allocated. If
you don't see memory rising when monitoring private bytes but suspect that
you are still running out of memory, you should monitor virtual bytes to see
if you are exhausting virtual memory.

Review the following MSDN article titled "Finding Leaks and Bottlenecks with
a Windows NT PerfMon COM Object" for more information about detecting memory
leaks:
http://msdn.microsoft.com/library/techart/perfmon.htm
To be certain your application is leaking memory, you should place the
suspect code in a loop with many iterations, and monitor private and virtual
bytes for any increases of memory. Watch to make certain that the number of
private bytes and virtual bytes doesn't eventually stay the same and stops
rising. If there is a point at which the memory stops rising, that is, it
does not continue to climb indefinitely, you are not seeing a memory leak
but are probably seeing some cache that is growing to its maximum size.
Capturing Heap Dumps with UMDH
UMDH (or Umdh_nt4.exe if you are using Windows NT 4.0 SP6) is a tool that
dumps information about a process's heap allocations. This information
includes the callstack for each allocation, the number of allocations made
through that callstack, and the number of bytes consumed through that
callstack. For example:

00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D This UMDH output shows that
there were 21280 (0x5320) bytes allocated total from the callstack. The
21280 bytes were allocated from 20 (0x14) separate allocations of 1064 bytes
(0x428). The callstack is given a identifier of BackTrace00053.

To produce a dump of the heap allocations, you must first let the operating
system know that you would like the kernel to track the allocations. This is
done by using the Gflags.exe utility.

Let's assume that you want to dump the heap contents for Notepad.exe. By the
way, most processes have more than one heap active and the UMDH log will
contain all of them. First you need to enable stack trace acquisition for
the application you want to test. This feature is not enabled by default.
The command to enable it is:
gflags -i notepad.exe +ust
The command does not enable stack tracing for processes that are already
running, but all future executions of Notepad.exe will have it enabled.
Alternatively, you can set the flag through the GFLAGS user interface (run
Gflags.exe without any arguments to get the user interface). Before using
UMDH, you also need to install the correct debug symbols for the components
of your application as well as the operating system. Typically, the
operating system symbols are installed in the SYMBOLS folder on the WINNT
folder. UMDH attempts to find the symbol files by using the _NT_SYMBOL_PATH.
The command for setting the path from a command prompt is:
set _NT_SYMBOL_PATH=%windir%\symbols
For more information about setting up symbolic debugging information, see
the "Debug Symbols" section later in this article.

With the image flags set and the symbols installed, you are ready to start
Notepad. After the program is started, you need to determine the Process ID
(PID) of the Notepad process just started. The command for this is:
tlist
You can find the PID from the output of the TLIST application. The PID
information can also be obtained from Task Manager. Let's assume the PID for
the Notepad process you just started is 124. You can use UMDH to get a heap
dump by using the following command:
umdh -p:124 -f:notepad124.log
Results: You've got a complete heap dump of the Notepad process in the
Notepad124.log file.
Using Dhcmp.exe to Compare UMDH Logs
While the UMDH log file contains valuable information about the current
state of the heaps for a process, if you are concerned with finding a memory
leak, it may be more valuable to compare the outputs of two logs and find
out what callstack has seen the largest growth between the two dumps. The
Dhcmp.exe utility helps compare two UMDH logs to provide an analysis of the
difference between them. Once you have two logs captured at different
intervals, you can then use the following command:
DHCMP dh1.log dh2.log > cmp12.txt
The .txt files will compare the effect on memory of running the suspect
memory hog application. The output of the file generated by DHCMP resembles
the following:

+ 5320 ( f110 - 9df0) 3a allocs BackTrace00053
Total increase == 5320 For each BackTrace in the UMDH log files, there is a
comparison made between the two logs files. This case shows that the last
log file specified in the DHCMP command line had F110 bytes allocated while
the first log in the DHCMP command line had 9DF0 bytes allocated for the
same BackTrace (callstack). The 5320 is the difference in the number of
bytes allocated. In this case, there were 5320 more bytes allocated between
the time the two logs were captured. The bytes came from the callstack
identified by BackTrace00053.

The next step is to find out what's in that backtrace. If you open the
second DH log file and search for "BackTrace00053" you might find something
that resembles the following:

00005320 bytes in 0x14 allocations (@ 0x00000428) by: BackTrace00053
ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D By looking at the callstack,
you can see that the LeakyFunc function is allocating memory by way of the
Visual C++ run-time library. If you find that the number of allocations
grows as you took more dumps, you might be able to conclude that memory is
not being freed.
Enabling Stack Traces
The most important information in UMDH logs is the stack traces of the heap
allocations. By analyzing them it can be understood whether a process leaks
heap memory. These stack traces are not acquired by default. The feature can
be enabled per-process or system-wide. Use the following command to enable
stack tracing system-wide:
gflags -r +ust
Restart the computer after this command.

For per-process enabling, the command is
gflags -i APPNAME +ust
Where APPNAME is the file name of the executable including the extension
(Services.exe, lsass.exe, and so on). The command will not enable stack
tracing for a process that is already running. For this reason, in the case
of processes that can't be restarted (services, lsass, winlogon), the test
compute must be restarted.

Use the following commands to verify what settings have been set system-wide
or for a specific process:

System-wide:
gflags -r
Specific process:
gflags -i APP-NAME
By default, the maximum stack trace depth is 16. If you want to see deeper
callstacks, you can increase this by running GFLAGS. Click to select System
Registry and type a new depth in the Max. Stack Trace Capture Depth edit
control. Click Apply, and then restart the computer.

IMPORTANT: If you are using Windows NT 4.0 Service Pack 6, you must use
Umdh_nt4.exe, rather than Umdh.exe, and you must use the above command to
set system-wide stack tracing. Be certain to reboot. Umdh_nt4 stack tracing
does not work on a per process basis on Windows NT version 4. It must be set
for the entire system.
Debug Symbols
UMDH uses the IMAGEHLP library for symbol manipulation. This is the standard
tool for such tasks and it is also used by Microsoft debuggers. One of the
most important steps to using UMDH is to ensure that you have good symbol
files (.dbg or .pdb file) to get a good stack trace. The debug symbol files
can be installed from the Windows NT CD, or in the case of Microsoft Windows
2000, from the Windows 2000 Support Tools CD. At a minimum, you need the
Kernel32.dbg and Ntdll.dbg symbol files. You can always acquire additional
debugging symbols as needed as you find out more about which components are
leaking the memory.

When building components with Visual C++, it is important that you not have
Program Database for Edit and Continue selected for the C++ compiler
options. Instead, select Program Database.

To set the symbol path, initialize the _NT_SYMBOL_PATH environment variable
to the path to be used. This can be done once when the test computer is set
up by using the System application in Control Panel (Advanced, Environment
Variables) or inside a command window before UMDH is run. Usually the
symbols are copied to the test machine in the %windir%\Symbols folder. In
this case, use the following command to set the variable:
set _NT_SYMBOL_PATH=%windir%\symbols
NOTE: Include the path to the PDBs for your application's components as
well.
Invoking UMDH
The only required command-line parameter for UMDH is the -p option, which
specifies the PID of the process from which a heap dump will be obtained.
The PID can be obtained by using Task Manager or the Tlist.exe program. For
a command similar to the following, the log will be dumped to the standard
output:
umdh -p:pID
UMDH also displays various informational messages to standard error, and
therefore if not redirected it will be mixed with the real log. To gather
the UMDH informational messages in a file, use the following command:
umdh -p:pID 2>umdh.msg
If you want to gather the log dumped by UMDH in a file, use one of the
following commands:
umdh -p:pID >umdh.log
-or-

umdh -p:pID -f:umdh.log
The commands are completely equivalent.

The default log obtained by UMDH contains an enumeration of heap consumers
sorted by allocation count. If, for debugging purposes, you also need a dump
of all allocated blocks with their corresponding stack traces, the -d option
must be used:
umdh -p:pID -d
If the log contains too much information, it can be limited only to big
users that have the allocation count above a certain threshold. Use the
following command:
umdh -p:pID -t:THRESHOLD
All the command-line options (-p, -f, -t, -d) can be specified
simultaneously in any order. Following is a complicated command-line
example:
umdh -p:123 -t:1000 -f:umdh.log -d
This command dumps the heaps for the process with PID 123 into the Umdh.log
file. It dumps only stack traces that account for more than 1000 allocations
and it also dumps the addresses of the heap blocks allocated through each
stack trace.
UMDH Output Explained
If you redirected the log to a file (umdh -p:pID -f:umdh.log), the contents
will resemble the following, which was obtained from a running Notepad
process:

UMDH: Logtime 2000-06-28 10:54 - Machine=MYMachine - PID=704
*********** Heap 00270000 Information ********************
Flags: 58000062
Number Of Entries: 87
Number Of Tags: <unknown>
Bytes Allocated: 00008DF0
Bytes Committed: 0000A000
Total FreeSpace: 00001210
Number of Virtual Address chunks used: 1
Address Space Used: <unknown>
Entry Overhead: 8
Creator: (Backtrace00007)
ntdll!RtlDebugCreateHeap+0x00000196
ntdll!RtlCreateHeap+0x0000023F
ntdll!LdrpInitializeProcess+0x00000369
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007
*********** Heap 00270000 Hogs ********************
000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00031
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007

000001A0 bytes in 0x4 allocations (@ 0x00000068) by: BackTrace00034
ntdll!RtlDebugAllocateHeap+0x000000FB
ntdll!RtlAllocateHeapSlowly+0x0000005B
ntdll!RtlAllocateHeap+0x00000D81
ntdll!LdrpAllocateDataTableEntry+0x00000039
ntdll!LdrpMapDll+0x000002A4
ntdll!LdrpLoadImportModule+0x0000010D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpLoadImportModule+0x0000011D
ntdll!LdrpWalkImportDescriptor+0x0000008B
ntdll!LdrpInitializeProcess+0x000009DC
ntdll!LdrpInitialize+0x0000028D
ntdll!KiUserApcDispatcher+0x00000007 The log contains a dump of
every heap in the process. In this example, the log starts with a heap at
address 270000. After a few global counters for the heap, the log contains a
dump in decreasing sorted order of stack traces that are responsible for the
most allocations. By comparing the dynamics of memory used at different
moments you can deduce what happened in the process and if any heap use
looks like a leak.
Problems That Can Be Encountered When Using UMDH
The most common errors when using UMDH are not having stack tracing enabled.
Incorrect symbols for Ntdll.dll prevent UMDH from running. For the other
symbols files, UMDH will run but the log file will contain stack traces that
do not have function names but instead have relative addresses inside
modules. A distant third error is specifying a wrong PID. The following
error message results when you attempt to run UMDH for a process that does
not have stack tracing enabled:
C:\>umdh -p:1140
UMDH: Logtime 2000-06-28 12:43 - Machine=MyMachine - PID=1140
Connecting.....Module enumeration complete.
SymGetSymFromName(process, ntdll!RtlpStackTraceDataBase, xxx) failed,
LastError = 126
UmdhGetAddrFromName couldn't find Stack Trace DB pointer
(ntdll!RtlpStackTraceDataBase).
ntdll.dll symbols are incorrect; we must be able to see non-import
symbols.
Use the following command to double-check the settings for the process you
are investigating:
gflags -i APPNAME
Use the following command in the case where you are relying on system-wide
stack tracing:
gflags -r
These commands show the list of flags set for the application. Note that in
the case of system-wide stack tracing, the feature might appear as active
but if you did not restart the computer after running the gflags -r +ust
command, it is not actually activated. If you want to know every application
that has stack tracing enabled, you can look at the USTEnabled key under the
following registry key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File
Execution Options
If you run UMDH on a process that has stack tracing enabled but have not
restarted the application since setting the flags, you may get the following
message in your logs:
A stack trace was not saved for this allocation (Index == 0)
If you run UMDH without setting the correct symbol path or the symbols are
incorrect, you may get an error message in the log. However, you may just
get incorrect or misleading callstacks. To verify whether you have the
correct symbols, launch the NTSD system debugger for a process, for example:
ntsd notepad
Then, from the debugger console, run the LD command to load the symbol
information for the module and the LM command to list what modules have
their symbols loaded. If the output of the LM command shows export symbols
loaded, the symbols are not good. If you have PDB symbols loaded, the
symbols are good. You may get the following error message if you specified
the wrong PID:
C:\>umdh -p:1000
UMDH: Logtime 2000-06-28 09:45 - Machine=MyMachine - PID=1000
Connecting...
OpenProcess failed, LastError = 0x57

Additional Tools
Using DHCMPGUI
The Dhcmpgui.exe tool can be used to compare two UMDH logs. This tool is
located in the Dhcmpgui.zip file. It calls out to Dhcmp.exe (make certain
that you have this in your PATH). Click File 1 and File 2 to specify the two
UMDH logs to compare.

After selecting the two files to compare, you will see a list of the
differences. The columns listed are the number of bytes allocated, number of
allocations, and the BackTraceID, respectively. You can sort by any one of
those columns by clicking the appropriate button, and then clicking Sort. To
see the BackTrace (callstack) for any line, just double-click it. This
provides an easy way to compare two logs and to quickly get to the callstack
for the callstack that is leaking memory.

The source code has been provided for Dhcmpgui.exe in case you want to make
any modifications. The project requires Visual C++ version 6.0.
Calling UMDH from Visual Basic
There may be times when it is useful to dump a number of logs over time
because the leak may not be very noticeable at first. For example, suppose
you suspect that your ASP application is leaking memory. It may be helpful
to write a COM component in Visual Basic that shells out to UMDH. You can
then call that component from your ASP page.

Following is some Visual Basic code that invokes UMDH and creates a log file
based on the current time:


Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Function GetProcessID()
GetProcessID = GetCurrentProcessId()
End Function
..
..
..
Dim strTime As String

Dim sProcID As String
sProcID = GetProcessID()
strTime = "MYLOG_" & Format(Now(), "hhmm")

Shell ("C:\UMDH\umdh -p:" & sProcID & " -f:d:\logs\" & strTime & ".txt")
Additional query words: DH umDHtools dumpheap displayheap

Keywords : kbfile kbsample kbOSWin2000 kbGrpDSVCDB kbDSupport
kbgraphxlinkcritical
Issue type : kbhowto
Technology : kbWinNTsearch kbWinNTWsearch kbWinNTW400 kbWinNTW400search
kbWinNT400xsearch kbwin2000AdvServ kbwin2000AdvServSearch kbwin2000Serv
kbWinNTSsearch kbWinNTS400xsearch kbWinNTS400 kbwin2000ServSearch
kbwin2000Search kbwin2000ProSearch kbwin2000Pro kbWinAdvServSearch


Last Reviewed: June 2, 2001
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.
 
G

Guest

I am actually glad someone else has seen this. For that past few months I
thought I had trashed my system, become infected with a virus, had to many
apps installed over time, etc... Last week I received a brand new Dell
GX260 with 1gb ram. After 3 days and only running standard apps, :blush:ffice,
outlook, IE, google search, trend virus, yahoo pager The new system does the
exact same thing.

So, to have fun here is what I found and have no cure for:

Reboot. Once desktop loaded run task manager. Open IE. Press cntrl "N".
I can open 56 new windows. once that is reached I am unable to right click
on desktop
for a menu, unable to open start menu, unable to do pretty much anything
until I close at least 1 IE window. Once one instance is closed i am unable
to do one thing more. If I have a command prompt open and this is occuring I
am unable to run telnet, ping, or any other command that requires output in
console.

I have been lookinng for this for quite some time and ran across the desktop
heap registry setting. I increased it to 10240 and it had no effect.

I found this thread after stumbling on the only other thread that matched
what happens to my system:
http://www.pcreview.co.uk/forums/thread-430986-2.php. Unfortunately the
only response given there was to "stop using the computer so ineffeciently".

I normally do not open over 50 instances of IE. However I tend to get
piled up with windows from varius apps from Yahoo, IE, office, outllook,
telnet sessions, remote desktop connections and other random things when I
have to do 50 things at once every day.

What is strange to me is that my work habits have not really changed... I
have been working like this for years. I can't even say when it started
happening I just know that it began occuring on my home system about the same
time as my office system and like a normal tech I figured it must be user
error... however, after replacing my system at the office with a new rather
decent system and running into the same issue immediately...

Someone somewhere... It's easy to reproduce and even if its "inefficient
behavior" to open so many items at one time this should not happen and i
don't recall it happening a year ago.

Oh yeah... and when this is occuring I still have around 300MB free ram...

blah blah blah...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top