Solving the "Insufficient Memory to Run" Situation (105274)
The information in this article applies to:
- Microsoft Windows Software Development Kit (SDK) 3.1
This article was previously published under Q105274 SUMMARY
Each task under Windows requires a data structure allocated below 1
megabyte (MB) called the Task Data Base (TDB). Under the debug version
of Windows, failure of a TDB's allocation shows up as:
t Kernel: GlobalAlloc(200) failed for ????
This error occurs within the context of LoadModule as it attempts to
start a new task under a low conventional memory condition.
The most common cause of low conventional memory is fixed allocations
made on behalf of a dynamic-link library (DLL). Fixed allocations
should be used only for code and data touched at interrupt time. All
other allocations should be made with the moveable attribute.
MORE INFORMATION
The Windows heap consists of all conventional and XMS memory available
after WIN.COM and WIN386.EXE/DOSX.EXE are loaded by MS-DOS. These two
physically separate blocks are combined into a single linear address
space to make up the global heap.
Windows allocates fixed objects with a bottom up/first fit algorithm.
As more fixed objects are allocated from the heap, conventional memory
gets pinched. Eventually, even a small allocation for the TDB fails
resulting in LoadModule returning 0 (zero).
The HEAPWALK.EXE utility provides a view onto the global heap to
determine what is using up conventional memory. The Sort Address menu
item sorts the main heap with lower addresses at the top of the list.
Any object with an address of 9FFFF or below is in conventional
memory. An object with an "F" set in the FLG column is fixed. Any
fixed object owned by an application or its dependent dynamic-link
libraries that is not a TDB (TYPE Task in HEAPWALK) should be
considered suspect.
The module definition (.DEF) file should mark CODE MOVEABLE
DISCARDABLE and DATA MOVEABLE. Any allocations should contain the
GMEM_MOVEABLE attribute. The EXEHDR.EXE utility can be used to
indentify modules that use the fixed attribute for their code or data
segments. Segments without the <moveable> attribute in the "flags"
column of EXEHDR's output are fixed.
Modification Type: | Major | Last Reviewed: | 11/6/1999 |
---|
Keywords: | kb16bitonly KB105274 |
---|
|