Microsoft KB Archive/112676

{|
 * width="100%"|

Troubleshooting Insufficient Memory Errors

 * }

Q112676

-

The information in this article applies to:


 * Microsoft Windows versions 3.0, 3.0a, 3.1, 3.11
 * Microsoft Windows for Workgroups versions 3.1, 3.11

-

SYMPTOMS
You receive insufficient memory errors in Windows or Windows for Workgroups when you try to run an application or perform a task. The specific error messages vary but are similar to the following:

Application Execution Error

Insufficient memory to run this application. Quit one or more Windows applications and then try again.

-or-

There is not enough memory available.

CAUSE
These errors may be caused by any of the following:


 * Insufficient Memory in the Global Heap
 * Insufficient Windows System Resources
 * File Corruption, Application Problems, or Configuration Problems
 * Low Memory Below 1 Megabyte (MB)
 * Low Windows Selectors
 * The BIOS Is Configured Incorrectly for Your System

Each of these issues, and possible workarounds, is discussed below. Although these issues are listed in the order they are most likely to occur, troubleshooting insufficient memory errors in Windows is not always a straightforward step-by-step process. To increase your knowledge of the major issues and decrease your troubleshooting time, you may want to read this entire article before you proceed.

Insufficient Memory in the Global Heap
The entire memory area that Windows controls is called "global memory" or the "global heap." The global heap begins at the location where MS-DOS first loads Windows into memory and ends at the top of available memory, which most often is at the top of physical memory. A Windows-based application returns an insufficient memory error if the amount of free memory in the global heap, after swapping, is insufficient to run the application or perform the selected task.

To determine how much memory is free in the global memory heap, set your Windows swap file to None in Control Panel's 386 Enhanced Virtual Memory dialog box and then choose About Program Manager from the Help menu in Program Manager. The Memory value reported is free memory in the global heap. If your application requires more memory than is available in the global heap, you may receive an "out of memory" error message. Increasing the size of the swap file may allow Windows to swap enough information to disk to free memory in the global heap.

Resolution:

To free more memory for your application, close one or more Windows-based applications or increase the size of your permanent swap file. If this does not correct the out of memory errors, you may need to update your system with additional RAM.

Insufficient Windows System Resources
Cause:

Insufficient memory errors also occur when Windows calculates that not enough system resources exist to perform the desired operation.

Status: In Windows 3.1 and Windows for Workgroups, system resources are determined by the following four heaps:


 * GDI.EXE (64-kilobyte [K] data segment)

The GDI.EXE heap contains information about graphical objects, such as pens, brushes, cursors, fonts, icons, buttons, scroll bars, and so on. In Windows 3.1 and Windows for Workgroups, the GDI heap is likely to be the bottleneck; therefore, closing heavily graphics-oriented applications results in GDI resources being freed.
 * USER.EXE (64K data segment)

The USER.EXE heap contains information about the windows currently in existence, dialog boxes, controls in dialog boxes, and so on.
 * menu (64K data segment)
 * menu strings (64K data segment)

The menu and menu string heaps are new in Windows 3.1. These heaps, originally combined in USER.EXE under Windows 3.0, were designed to free up space in the USER heap. These heaps are created dynamically (that is, at run time) by the USER heap. They are not contained in any .EXE files and are each limited to 64K.

When you choose About Program Manager from the Help menu, Windows and Windows for Workgroups report the heap with the smallest amount available as the amount of free system resources.

To maintain backwards compatibility with earlier versions of Windows and Windows-based applications, all four heaps were each designed with a 64K data segment limit.

Resolution:

Some applications may not release all the system resources they use after they are closed. If you have a chronic problem with one or more applications, contact the manufacturer of the applications for more information.

Some 16-bit Windows applications (such as Microsoft Word for Windows, Microsoft Access, Microsoft Visual Basic, and Microsoft Excel) require ample free amounts of both USER.EXE and GDI.EXE heaps because of the graphical user interface (GUI). If these applications do not find available space to load their information into these heaps, they generate an insufficient memory error (or a similar error). A large Excel workbook and large graphical images on machines running high resolution video drivers rely heavily on the GDI resource because of their graphical nature.

If your system resources are often low, keeping few applications running is probably the best solution; however, you may also want to try the following:


 * Minimize seldom-used groups to conserve system resources.
 * Do not use wallpaper, or use a small bitmap and tile it.
 * Try not to open groups that have many icons.
 * If you run an application that uses system resources every time it runs, try to keep it open instead of closing and reopening it many times.
 * Try not to load fonts that are not needed.
 * Check your screen savers to make sure that they are not overusing resources.

File Corruption, Application Problems, or Configuration Problems
Cause:

Insufficient memory errors may occur when two or more memory resident programs or drivers conflict, when Windows accesses corrupted files or files that are still in compressed form, or when there is a problem in the application you are running.

Resolution:

Try to isolate the problem to a specific application. Clean boot the computer so that only the necessary Windows and application-specific device drivers and terminate-and-stay-resident (TSR) programs are loading in the CONFIG.SYS and AUTOEXEC.BAT files. For more information about a "clean boot" for Windows and Windows for Workgroups, query on the following words in the Microsoft Knowledge Base:

"clean and boot and append" Disable any applications that start automatically when you start Windows (check the WIN.INI file and the StartUp group), run Windows Setup and change to standard Windows drivers (VGA, No Mouse, No Network), and use the Program Manager (PROGMAN.EXE) as your Windows shell.

If the insufficient memory errors occur only in a specific application, try reinstalling the application to a new directory or manually expand any necessary files to rule out file corruption.

If the application has never worked, it is possible that the files on the original installation disks are corrupted. Try to install the offending application on another computer using the same disks.

If these procedures do not eliminate the problem, contact the manufacturer of the application that is causing the errors.

Low Memory Below 1 Megabyte (MB)
Cause:

When Windows creates a new task (that is, starts a new application), the Windows loader creates a task database (TDB) for it. The TDB contains vital information about the task, such as its current directory, its instance handle, and so on. To maintain compatibility with 16-bit Intel processors and MS-DOS, Windows creates the TDB in memory below 1 MB in the global heap. Because the only memory below 1 MB in the global heap is conventional memory, the TDB must be created below 640K (conventional memory).

Status:

Memory below 1 MB is limited and should be used sparingly. TDBs are not the only block of memory that may end up below 1 MB. Applications such as Microsoft Word for Windows, Microsoft Remote Access Services (RAS), Microsoft Anti-Virus, Microsoft Mail, Microsoft Schedule+, and multimedia packages are examples of applications that load .DLL files into the first megabyte of memory when loading or performing certain operations.

Every segment in the Windows global heap is marked with certain attributes that tell Windows how to manage the segment. First and foremost, the segments are marked as Fixed or Moveable. A fixed segment always resides at the same physical memory location where it was first allocated (although it can be paged if it is not "page-locked"). Movable code can be moved or marked as Discardable code. This means that Windows can move moveable segments in memory if necessary to make room for other memory allocations or, if the code is marked as Discardable, Windows can discard the code by determining the "least recently used" (LRU) discardable segment. Windows can later reload the discardable code by accessing the application's .EXE file.

The enhanced mode global heap is composed of a series of free and in-use blocks stored contiguously in memory. When Windows is asked by an application to allocate a block of memory, KRNL386.EXE starts at the beginning or end of the global heap, depending on the type of code the application loads, and iterates through each of the blocks until it finds a suitably sized free block.

KRNL386.EXE starts to allocate fixed segments from the bottom up in the global heap. At the top of the global heap, Windows allocates discardable segments. Between the fixed and discardable segments, Windows allocates moveable segments. When an application starts and Windows needs to allocate fixed segments, Windows starts searching from the bottom up for a sufficiently large free block below the area of moveable segments. This is to avoid memory fragmentation. If it cannot find a segment large enough it begins moving moveable segments up in memory to make room. If that doesn't work, Windows begins discarding discardable segments.

TDBs must be located below 1 MB, but fixed and moveable memory segments do not. An insufficient memory error that appears when you try to start an application may occur because fixed segments, which are loaded starting from the bottom of the global heap to avoid memory fragmentation, end up loading in the first megabyte. These fixed memory segments cannot be moved if they are "page-locked," hence they may consume memory space that Windows would otherwise use to load the TDBs. KRNL386.EXE's desire to keep fixed memory as low as possible conflicts with the need to keep memory below 1 MB as free as possible.

Because of the way Windows allocates memory, memory below 1 MB is a limited resource even when you are running Windows-based applications. Program developers are encouraged to ensure that their programs and .DLL files do not use this space needlessly. Fixed memory segments should not be used unless absolutely necessary.

Resolution:

To troubleshoot this problem, optimize conventional memory as much as possible. If you have MS-DOS version 6.0 or 6.2, use MemMaker to optimize conventional memory. You may also want to change the order in which your programs or drivers load. This may alter where the fixed code gets located and minimize memory fragmentation. For a workaround, create a multi-boot configuration to minimize what loads into conventional memory for particular operations. This may free enough space so that Windows can load the TDBs.

Disable any applications that start automatically when you start Windows (check the WIN.INI file and StartUp group), run Windows Setup and change to standard Windows drivers (VGA, No Mouse, No Network), and use the Program Manager (PROGMAN.EXE) as your Windows shell. For troubleshooting, remove any third-party Windows drivers or virtual device drivers (VxDs) by rebuilding the WIN.INI and SYSTEM.INI files. For more information about this procedure, query on the following words in the Microsoft Knowledge Base:

"win.ini and win.sr_ and create" -and-

"system.ini and system.sr_ and create"

Low Selectors
Cause:

An important aspect of Windows-based application memory management that is NOT included in the free system resources percentage is the number of selectors. A selector is a memory pointer that is consumed with each memory allocation made by a Windows-based application. Windows has a fixed number of selectors (4096 in standard mode, 8192 in 386 enhanced mode). If a Windows-based application allocates a very large number of small data objects, it is possible to run out of selectors. This also produces an insufficient memory message.

Resolution:

These problems are application specific. Writing a Windows-based application to handle its own data objects more efficiently can help in this situation. If you experience a chronic problem with a particular application while none or few other applications are loaded and the computer is clean-booted, contact the application vendor. It is important that the vendor become aware of the problem so that it can be corrected if possible.

The BIOS Is Configured Incorrectly for Your System
If your BIOS is incorrectly configured for a floppy disk drive, you may receive the aforementioned error messages when you attempt to install software. For example, an error can occur if you have a 1.44-megabyte 3.5- inch floppy disk drive installed and the BIOS is set for a 1.2-megabyte 5.25-inch disk drive.

MORE INFORMATION
You can also receive "Insufficient memory" error messages if you try to load an application over the network to run on a Windows-based computer running an MS-DOS network client when the network is heavily congested. Request timeouts during application loading are misinterpreted locally as an insufficient memory condition.

Also, you can receive this error message if the Execute permission has been removed from the network share containing the application.