to present a uniform memory model to all executing programs , modern operating systems abstract memory addresses used by the system &# 39 ; s virtual memory manager ( vmm ). ( the vmm is a process that is primarily responsible for managing the use of both main memory and virtual memory . to do so , the vmm keeps track of each page of data that is in memory and swaps pages to and from the storage device both on demand and routinely .) this memory abstraction creates a range of available memory addresses that is referred to as an address space . when memory is requested from the system , a free space of the requested size ( i . e ., the requested number of free pages ) must exist in the system memory . if a free space does not exist , the system may have to swap pages of data in and out of memory . this may impact the performance of the system . the present invention is used to reduce the likelihood that the system may run out of free pages . note that it is assumed that there is a standard heap allocator and an interface to the vmm to disclaim pages in the system . a heap is a process that is used for allocating and freeing objects dynamically for use by a program . an object is an opaque block of memory space . an opaque block of memory space may not be modified by the allocator . with reference now to the figures , fig1 a depicts a conceptual view of an exemplary slab of memory 100 . the slab 100 is made of 16 contiguous pages ( i . e ., 16 × 4 kbytes ). in this particular example , the slab is made of 1 . 5 kbytes objects and presently seven ( 7 ) of the objects contain data ( objects 110 - 140 ). the rest of the slab 100 is empty . the slab also has a header 105 . as will be explained later , the header 105 contains an object - free list as well as some other control structures . a collection of slabs is called a pile . fig2 depicts a conceptual view of an exemplary pile 200 of slabs ( slabs 250 , 260 and 270 ). each pile has a maximum number of pages that it can contain . note that all slabs in a pile are divided into same sized objects . a pile has to be initialized . initialization of the pile 200 consists of initializing a sorted linked list of slabs as well storing some tracking fields into header 205 . specifically , a pointer ( pointer 210 ) from header 205 of pile 200 points to header 255 of slab 250 ( i . e ., the first slab in the pile ). pointer 220 from header 255 of slab 250 points to header 265 of slab 260 . likewise , pointer 230 from header 265 of slab 260 points to header 275 of slab 270 . basically , a pointer from the header of an immediately preceding slab points to the header of an immediately succeeding slab in each pile . sizes of the slabs and of the objects desired are also entered in header 205 . the slabs are sorted into sub - groups depending on whether their allocated space is full ( i . e ., no free objects ) or partially full . before a slab can be used , it has to be initialized as well . to initialize a slab is to divide the slab into a plurality of same sized objects . thus in this example , each slab is divided into 1 . 5 kbytes objects . note , however , that a slab is not allocated until needed . for example , if more pieces of data of the type for which the slabs in the pile 200 are constructed is being brought into memory , they are stored in successive free objects in the first slab 250 . when the slab 250 is full and if more data of the same type is being brought into memory , slab 265 will be constructed and initialized . optimal slab sizes are dependent upon the data to be stored therein . in any case , when a slab is initialized , an object handle is added to each free object . the handle is used to help track free objects as well as to provide a pointer back to the slab when the object is no longer free . specifically , if a slab has a free object , a pointer from its header will point to the free object . for example , slab 260 has a free object 268 . thus , pointer 266 from header 265 points to object 268 . if there is another free object down in the slab , a pointer from handle 267 of the free object 268 will point to that empty object and so on . thus , a linked list of pointers is used to indicate all free objects in a slab . fig3 a is a conceptual view of an exemplary slab header 300 in accordance with the invention . the slab header 300 has a reference count 305 , a slab list 310 , an object free list 315 , a flag 325 and a page reference count array 320 . the reference count 305 contains the number of objects in the slab . the slab list is a linked list of other slabs in the pile and the free list 315 is a linked list of free objects . the flag 325 is used to indicate whether a slab is to be squeezed . the page reference count array 320 is used to keep tab of all allocated pages in the slab that have data therein . each location in the array 320 is associated with a page in the slab . returning to the slab in fig1 a where the first seven objects in the slab are filled with data , three pages are used ( pages 0 , 1 and 2 ). page zero ( 0 ) contains data from three objects , objects 110 , 115 and 120 . thus , in the location of the array that is associated with page zero ( 0 ), a reference count of three ( 3 ) is entered . page 1 , however , contains data from four objects ( objects 120 , 125 , 130 and 135 ). hence , a page count reference of four ( 4 ) is entered in its associated location in the array 320 . similarly , page 2 has data from two objects , objects 135 and 140 , therefore a reference count of two ( 2 ) is entered in its associated location in the array . the other locations of the array have a zero reference count since their associated pages are empty . the invention makes use of four function calls : ( 1 ) alloc ; ( 2 ) free ; ( 3 ) config_max ; and ( 4 ) config_callback . each one of these functions will now be explained . alloc is a function that is used to allocate an object off a slab . when alloc is called , the free list 315 of each slab is scrutinized in their sorted order . the first slab to contain a free object will be used . then , the first free object on the free list will be allocated , if the slab contains more than one empty object . the object will then be removed from the free list 315 ( see fig3 a and 3 b ) and the slab object reference count 305 will be updated ( i . e ., incremented ). if none of the slabs contain a free object , the heap allocator will allocate a new slab that will be added to the pile , certain conditions permitting . for example , the maximum page count of a pile may not be exceeded . thus , if by adding a new slab the page count of the pile will exceed its limit , the allocation will be denied . if a slab is added to the pile , the slab will be initialized before the object is stored therein . free is a function that is used to de - allocate objects . depending on whether an object to be de - allocated is in a slab targeted to be squeezed , the following may occur : ( 1 ) if the slab is not a targeted slab ( i . e ., flag 325 is not set ), the object will be de - allocated by simply adding the object back onto the free list 315 of the slab and decrementing the object reference count 305 . when the object reference count 305 reaches zero ( 0 ), the slab will be de - allocated using the heap allocator ; ( 2 ) if the slab from which the object is to be de - allocated is a slab marked to be squeezed , the object will not be put back on the free list since the slab is to be de - allocated . the reference count , however , will be decremented and when it reaches zero , the slab will be de - allocated . in addition , the page reference count 320 will be tracked . if , when removing the object there is a page that does not contain data anymore , the page will be disclaimed ( i . e ., any bindings to physical memory associated with the page will be removed ); thus reducing the memory usage of the slab . as an example , suppose the slab in fig1 a is marked to be squeezed ( i . e ., flag 325 is set ), all its free pages will be disclaimed . thus , only the first three pages that contain the seven allocated objects ( objects 110 - 140 ) will remain in the slab . now suppose the last two objects ( objects 135 and 140 ) become free , then the slab will be as shown in fig1 b . in fig1 b , the crossed out sections have been disclaimed and thus are not available anymore to be used . the object reference count in header 300 will be decremented to five ( see fig3 b ). the free list 315 will be zero and the flag 325 will be set . the page reference count array 320 will be as shown . particularly , the location associated with page zero ( 0 ) will have an entry of three ( 3 ) therein since page zero ( 0 ) continues to hold the data of three objects . the entry in the location associated with page one ( 1 ), however , will be updated down to three ( 3 ) since now it only holds data of three objects instead of four objects ( see fig1 a and 1 b ). likewise , the entry in the location associated with page two ( 2 ) will be decremented to zero ( 0 ) since when objects 135 and 140 are de - allocated , page two ( 2 ) no longer holds any data . according to the invention , since page two ( 2 ) no longer holds data , it may be disclaimed . config_max is used to reconfigure a maximum page count of a pile . that is , at any given time an executing application may invoke the config_max function to reconfigure the maximum number of pages that a pile may contain . note that the application may choose any time that it deems appropriate to call the config_max function . if the current number of pages in the pile exceeds the reconfigured number , then a squeeze operation must occur . when a squeeze operation is to occur , the invention first determines the number of objects in each slab . this can easily be done by consulting reference count 305 of each header of a slab . the first partially - filled slab will be chosen to be squeezed . the flag 325 in the header of the slab to be squeezed is set . to squeeze a slab , the invention iterates through the objects to determine which objects are actually allocated . while doing so , the page reference count array 320 is updated . any allocated page that does not hold data for any of the objects will be disclaimed and the slab will be moved to the “ full ” list of slabs , since no more data may be placed therein . further , if the application has supplied a callback function , the objects in the slab that are still allocated are iterated over and the callback function is called with a reference to the object for each allocated object . the callback function is free to do what it wants with the referenced object . ideally , the callback function can free the referenced object , or mark it to be freed later . config_callback is the command used by an application to provide a callback function . as mentioned above , a callback function is free to do what it wants with any referenced object . fig4 is a flowchart of a process that may be used to implement the free function of the present invention . the process starts when the function is called ( step 400 ). then the object to be freed is de - allocated and the object reference count in the header of the slab in which the object is being de - allocated is decremented ( steps 402 and 404 ). after decrementing the object reference count , a check is made to determine whether the object count is equal to zero ( 0 ). if so , the slab will be de - allocated and the process ends ( steps 406 , 408 and 410 ). if the object reference count is not equal to zero ( i . e ., the count is greater than zero ), then a check will be made to determine whether the slab is marked to be squeezed . if not , the object that has been freed is added to the free list of the slab header ( steps 406 , 412 , 414 and 410 ). if the slab has been marked to be squeezed , the page reference count array is updated . if there is not an empty page after de - allocating the object , the process then ends . if there is an empty page after the object is de - allocated , the empty page will be disclaimed before the process ends ( steps 412 , 416 , 418 , 420 and 410 ). fig5 is a flowchart of a process that may be used to implement the alloc function of the present invention . the process starts when the function is called ( step 500 ). then a check is made to determine whether there is a free object in one of the slabs in the pile . if so , the free object will be allocated and the object will be removed from the free list in the slab header . the object reference count will also be updated before the process ends ( steps 502 , 516 , 518 , 520 and 514 ). if there is not a free object in any of the slabs in the pile , a new slab will be constructed and initialized if the page reference count of the pile will not exceed the maximum allowable page count of the pile . after initializing the slab , the process will jump to step 516 ( steps 502 , 504 , 506 , 508 and 516 ). if the maximum allowable page count of the pile will be exceeded after constructing the new slab , the request will be denied by generating an error message before the process ends ( steps 504 , 512 and 514 ). fig6 is a flowchart of a process that may be used to implement the config_max function of the present invention . the process starts when the function is called ( step 600 ). the new maximum allowable page reference count will be entered into the header of the pile ( step 602 ). then a check is made to determine whether the current page reference count exceeds the new maximum allowable page reference count . if so , a slab will be chosen to be squeezed by setting the flag in the header of the slab and the page reference count array is then updated ( steps 604 , 606 , 608 and 610 ). then a check is made to determine whether there are any empty pages in the chosen slab . if so , the free pages will be disclaimed . then , a check will be made to determine whether a callback function has been supplied . if not , the process ends ( steps 612 , 614 616 and 618 ). if there has been a callback function supplied , the function will be executed before the process ends ( steps 616 , 620 and 618 ). if there are not any free pages , the process will jump to step 616 ( steps 612 and 616 ). likewise , if the current page reference count is not greater than the new maximum page reference count , the process ends ( steps 604 and 618 ). fig7 is a block diagram illustrating a data processing system in which the present invention may be implemented . data processing system 700 employs a peripheral component interconnect ( pci ) local bus architecture . although the depicted example employs a pci bus , other bus architectures such as accelerated graphics port ( agp ) and industry standard architecture ( isa ) may be used . processor 702 and main memory 704 are connected to pci local bus 706 through pci bridge 708 . pci bridge 708 also may include an integrated memory controller and cache memory for processor 702 . additional connections to pci local bus 706 may be made through direct component interconnection or through add - in boards . in the depicted example , local area network ( lan ) adapter 710 , scsi host bus adapter 712 , and expansion bus interface 714 are connected to pci local bus 706 by direct component connection . in contrast , audio adapter 716 , graphics adapter 718 , and audio / video adapter 719 are connected to pci local bus 706 by add - in boards inserted into expansion slots . expansion bus interface 714 provides a connection for a keyboard and mouse adapter 720 , modem 722 , and additional memory 724 . small computer system interface ( scsi ) host bus adapter 712 provides a connection for hard disk drive 726 , tape drive 728 , and cd - rom drive 730 . typical pci local bus implementations will support three or four pci expansion slots or add - in connectors . an operating system runs on processor 702 and is used to coordinate and provide control of various components within data processing system 700 in fig7 . the operating system may be a commercially available operating system , such as windows xp , which is available from microsoft corporation or aix , which is an ibm product . an object oriented programming system such as java may run in conjunction with the operating system and provide calls to the operating system from java programs or applications executing on data processing system 700 . “ java ” is a trademark of sun microsystems , inc . instructions for the operating system , the object - oriented operating system , and applications or programs as well as the invention are located on storage devices , such as hard disk drive 726 , and may be loaded into main memory 704 for execution by processor 702 . those of ordinary skill in the art will appreciate that the hardware in fig7 may vary depending on the implementation . other internal hardware or peripheral devices , such as flash rom ( or equivalent nonvolatile memory ) or optical disk drives and the like , may be used in addition to or in place of the hardware depicted in fig7 . also , the processes of the present invention may be applied to a multiprocessor data processing system . the description of the present invention has been presented for purposes of illustration and description , and is not intended to be exhaustive or limited to the invention in the form disclosed . many modifications and variations will be apparent to those of ordinary skill in the art . the embodiment was chosen and described in order to best explain the principles of the invention , the practical application , and to enable others of ordinary skill in the art to understand the invention for various embodiments with various modifications as are suited to the particular use contemplated .