Abstract:
Mechanisms of memory management in a real time runtime environment having a garbage collected memory heap are provided. The runtime environment includes a critical real time thread that is precluded from accessing the garbage collected memory heap. The runtime environment further includes a scoped memory area for the allocation of objects therein for access by the critical real time thread. The mechanisms determine whether the critical real time thread currently accessing the scoped memory area is in a defined state so as to accommodate garbage collection of the scoped memory area. The mechanisms further initiate, in response to a determination that the critical real time thread currently accessing the scoped memory area is in the defined state, a process of garbage collection of the scoped memory area.

Description:
BACKGROUND 
       [0001]    The present invention relates to memory management in a computer system. More particularly it relates to garbage collection of scoped memory accessed by critical real time threads. 
         [0002]    Memory management in runtime environments is often devised so as to provide convenience for the software engineer. For this reason, runtime environments such as Java (Java is a Registered Trademark of Sun Microsystems Inc.) include heap memory having a garbage collector. A garbage collector is a runtime facility for automatically identifying and discarding unused data from memory, such as objects, so as to free up storage. 
         [0003]    Garbage collection is a luxury afforded by the efficiencies of modern computer systems that serves to liberate software engineers from the task of programmatically discarding each and every unused object. It does, however, present some drawbacks. One such drawback is that the process of garbage collection generally requires the suspension of execution of software threads accessing the heap. This is because the process of identifying and discarding unused objects cannot normally be undertaken while software threads actively allocate and access existing or new objects. For the garbage collector to operate effectively, the state of the heap is to be preferably static and determinate for the duration of the garbage collection process. The duration of suspension of threads for garbage collection depends on the number and variety of data objects existing in the heap and can range from an imperceptibly short duration to periods long enough to be perceived by a user. Thus the process of garbage collection can lead to delays of indeterminate frequency and duration. These downsides render garbage collected runtime environments inherently unsuitable for software depending on continuity of execution and predictability. Such software includes critical real time applications such as those used in monitoring and control applications, and these applications are normally precluded from accessing a garbage collected memory in order to ensure their consistency and stability. 
         [0004]    To address these downsides of garbage collected heap memory, runtime environments can be adapted to use scoped memory areas. Scoped memory areas are areas of memory suitable for the allocation and de-allocation of objects without some of the disadvantages of garbage collected heaps. A software thread can enter a scoped memory area and all object allocations by the thread will then be made within the scoped memory area. The thread can also enter multiple scoped memory areas in a nested fashion. For example, the thread can enter a second scoped memory area which becomes the default allocation area. Scoped memory areas are organised in a scope graph with each scoped memory area having a parent being the previously entered scoped memory area. A first scoped memory area has a primordial scoped memory area as its parent. 
         [0005]    A thread count is maintained for each scoped memory area of a number of active threads in the area. The thread count coupled with the scope graph indicates when a scoped memory area, including any objects allocated in the scoped memory area, is discardable. For example a scoped memory area may be discardable when an associated thread count is decremented from one to zero and the scoped memory area is not a parent for any other scoped memory area. In this way, scoped memory areas offer alternative allocation spaces for objects in an otherwise garbage collected runtime environment, such as Java. The use of such scoped memory areas can address the problem of delays and uncertainty in application execution caused by garbage collection algorithms since all objects in scoped memory areas become discardable at the same time defined in terms of thread usage of the memory area and the organisation of a scope graph. 
         [0006]    A first object in a first scoped memory area can reference a second object in a second scoped memory area. However, since individual scoped memory areas can become completely discardable it is necessary to enforce strict rules regarding valid and invalid references between objects in different scoped memory areas. These rules are necessary to guarantee that a parent scoped memory area has a lifetime that is at least that of its child scoped memory areas so that objects in descendant memory areas can reliably reference objects in ancestor memory areas. In this way, dangling references can be avoided. This is described in “Efficient Memory-Reference Checks for Real-time Java” (Corsaro and Cytron, ACM SIGPLAN Volume 38, Issue 7 Jul. 2003). 
         [0007]    One such rule is that a scoped memory area has at most one parent. This is known as the “single parent rule”. The single parent rule provides that the order of entry into scoped memory areas by different threads is always the same because the order of entry of threads into scoped memory areas defines the structure of the scoped memory areas in the scope graph. Further, a source object allocated in a source scoped memory area can only reference target objects in the same or ancestral scoped memory areas. An ancestral scoped memory area is a memory area which is entered by a thread before the source scoped memory area. The source scoped memory area is said to have inner scope with respect to that of the target object. This criterion ensures that the source object will always be de-allocated before the target object. Attempts to create references which do not satisfy the criterion must fail according to the Real-Time Specification for Java (Bollella et al, Addison-Wesley, 2000). Thus the criterion must be checked in an efficient manner whenever a new reference to a target object is created. 
         [0008]    One way to determine whether this criterion is satisfied for the creation of a reference between objects is to iterate through scoped memory areas in a scope graph. Iteration starts at the source scoped memory area and progresses through each parent scoped memory area checking for the target scoped memory area. If the target scoped memory area is encountered within the scope graph during the iterations then it can be concluded that the criterion is satisfied because the target area is an ancestor of the source area. If the iterations reach the primordial scoped memory area (the “root” of the scope graph) then it can be concluded that the criterion is not satisfied because the target scoped memory area is not an ancestor of the source scoped memory area. 
         [0009]    An alternative approach is to determine an index of the distance between the scoped memory area of the target object and the primordial scoped memory area. This distance can be considered to be a “depth” of the target scoped memory area. Additionally, an index of the distance between the scoped memory area of the source object and the primordial scoped memory area can be determined as a “depth” of the source scope. The term depth here is used to indicate that scoped memory areas exist at levels which are some distance from the primordial scoped memory area. Deeper scoped memory areas are located at a level in the scope graph which is further from the primordial scoped memory area. A comparison of these indices of depth will indicate whether the target scoped memory area is potentially an ancestor of the source scoped memory area because descendent areas will always be deeper (further from the primordial scoped memory area) than ancestor areas. 
         [0010]      FIG. 1  is a block diagram of an exemplary scoped memory system  100  in the prior art. The scoped memory system is an arrangement of a part of a storage of a computer system such as the scoped memory system described in the Real-Time Specification for Java (Bollella et al, Addison-Wesley, 2000). In use, the scoped memory system  100  includes a scope graph  102  which is a data structure arrangement of zero or more scoped memory areas such as scoped memory area  106 . Scope graph  102  is commonly referred to in the art as a “scope stack” although the data structure of scope graph  102  is not necessarily a stack data structure. The scope graph  102  can be implemented as a directed graph data structure, a stack data structure, a tree data structure, a linked list or any data structure suitable for the storage of zero or more scoped memory areas. 
         [0011]    Scoped memory area  106  is a defined area of memory in storage suitable for the allocation and reference of software objects. Objects can be allocated and accessed in an allocated objects  112  part of the scoped memory area by software threads which execute in the context of the scoped memory area  106 . The scoped memory area  106  further includes a thread count  110  as a count of a number of software threads executing in the context of the scoped memory area  106 . A thread executes in the context of the scoped memory area  106  by explicitly entering the scoped memory area, such as by calling of an application programming interface function. Once a thread has entered the scoped memory area  106 , allocations of objects will be undertaken within the scoped memory area  106  unless specifically allocated elsewhere by the thread, such as in the general heap or another scoped memory area. 
         [0012]    Scoped memory area  106  further includes a parent field  108  which includes a reference to a parent scoped memory area. As described above, a scoped memory area has at most one parent. An arrangement of scoped memory areas defined by way of a parental relationships there-between defines the scope graph  102 . An initial scoped memory area having no particular parent will refer to a primordial scoped memory area  104  as its parent by way of a placeholder. 
         [0013]    Critical software depending on continuity of execution and predictability can use scoped memory areas for the allocation of objects. Since scoped memory areas are not garbage collected, delays and uncertainty associated with garbage collection processes do not affect scoped memory or software threads using scoped memory. While this provides certainty for critical software threads, it presents the disadvantage that individual objects allocated in scoped memory are not discarded until all objects in the scoped memory are discardable. Thus scoped memory can become consumed by numerous unused objects. 
         [0014]    It would therefore be advantageous to provide the advantages of garbage collection with the certainty and consistency of scoped memory. 
       SUMMARY 
       [0015]    In one illustrative embodiment, a method of memory management in a real time runtime environment having a garbage collected memory heap is provided. The runtime environment includes a critical real time thread that is precluded from accessing the garbage collected memory heap. The runtime environment further includes a scoped memory area for the allocation of objects therein for access by the critical real time thread. 
         [0016]    The method comprises determining whether the critical real time thread currently accessing the scoped memory area is in a defined state so as to accommodate garbage collection of the scoped memory area. The method further comprises initiating, in response to a determination that the critical real time thread currently accessing the scoped memory area is in the defined state, a process of garbage collection of the scoped memory area. 
         [0017]    In other illustrative embodiments, a computer program product comprising a computer useable or readable medium having a computer readable program is provided. The computer readable program, when executed on a computing device, causes the computing device to perform various ones, and combinations of, the operations outlined above with regard to the method illustrative embodiment. 
         [0018]    In yet another illustrative embodiment, a system/apparatus is provided. The system/apparatus may comprise one or more processors and a memory coupled to the one or more processors. The memory may comprise instructions which, when executed by the one or more processors, cause the one or more processors to perform various ones, and combinations of, the operations outlined above with regard to the method illustrative embodiment. 
         [0019]    These and other features and advantages of the present invention will be described in, or will become apparent to those of ordinary skill in the art in view of, the following detailed description of the example embodiments of the present invention. 
     
    
     
       BRIEF DESCRIPTION OF SEVERAL VIEWS OF THE DRAWINGS 
         [0020]    The invention, as well as a preferred mode of use and further objectives and advantages thereof, will best be understood by reference to the following detailed description of illustrative embodiments when read in conjunction with the accompanying drawings, wherein: 
           [0021]      FIG. 1  is a block diagram of an exemplary scoped memory system in the prior art; 
           [0022]      FIG. 2  is an example block diagram of a computer system suitable for the operation of illustrative embodiments of the present invention; 
           [0023]      FIG. 3  is an example block diagram of a software application in execution in a software runtime environment in accordance with one illustrative embodiment of the present invention; 
           [0024]      FIG. 4  is an example flowchart of a method of the scoped memory garbage collector in accordance with one illustrative embodiment of the present invention; and 
           [0025]      FIG. 5  is an example block diagram of a scoped memory area in use by a thread in accordance with one illustrative embodiment of the present invention; 
           [0026]      FIG. 6  is an example block diagram of nested scoped memory areas in accordance with one illustrative embodiment of the present invention; 
           [0027]      FIG. 7   a  is an example flowchart of a method for identifying root references to objects allocated in a scoped memory area for garbage collection in accordance with one illustrative embodiment of the present invention; 
           [0028]      FIG. 7   b  is an example flowchart of a method for identifying a set of potential child scoped memory areas for the garbage collection of  FIG. 6  in accordance with one illustrative embodiment of the present invention; 
           [0029]      FIG. 8  is an example flowchart of a method of memory management in a real time runtime environment in accordance with one illustrative embodiment of the present invention; 
           [0030]      FIG. 9   a  is an example block diagram of a critical real time thread in a software application in accordance with one illustrative embodiment of the present invention; and 
           [0031]      FIG. 9   b  is an example block diagram of a critical real time thread in a software application in accordance with an alternative illustrative embodiment of the present invention. 
       
    
    
     DETAILED DESCRIPTION 
       [0032]      FIG. 2  is a block diagram of a computer system suitable for the operation of embodiments of the present invention. A central processor unit (CPU)  202  is communicatively connected to a storage  204  and an input/output (I/O) interface  206  via a data bus  208 . The storage  204  can be any read/write storage device such as a random access memory (RAM) or a non-volatile storage device. An example of a non-volatile storage device includes a disk or tape storage device. The I/O interface  206  is an interface to devices for the input or output of data, or for both input and output of data. Examples of I/O devices connectable to I/O interface  206  include a keyboard, a mouse, a display (such as a monitor) and a network connection. 
         [0033]      FIG. 3  is an example block diagram of a software application in execution in a software runtime environment in accordance with one illustrative embodiment of the present invention. The software application includes threads of execution  302  to  308 . Each thread is a separate stream of software execution and includes software instructions and thread data normally stored in an area of storage known as a memory stack. Threads  302  to  308  include references  310  to  320  into allocated heap memory including a garbage collected heap  332  and a scoped memory area  330 . The garbage collected heap  332  is a memory allocation space for threads in execution in the runtime environment. Software objects  340 ,  338  are allocated in the garbage collected heap  332 . Periodically a garbage collector is operable to process the garbage collected heap  332  to discard unused objects as is well known in the art. The scoped memory area  330  is also a memory allocation space for threads in execution, and software objects  334 ,  336  are allocated in the scoped memory area  330 . Scoped memory area  330  includes a thread count  350  of a number of threads configured to access the scoped memory area  330 . The thread count is useful to determine when the scoped memory area  330  is discardable, such as when the thread count  350  indicates that no threads access the scoped memory area  330 . Scoped memory area further includes a reference to a parent scoped memory area, such as a primordial scoped memory area, as is well known in the art. 
         [0034]    References  310  to  320  are object references within threads  302  to  308 . For example, each such reference can include a memory address, base and offset, or pointer to a software object. Thread  302  includes a reference  310  to object  340  in the garbage collected heap  332 . Thread  302  further includes a reference  312  to object  338  in the garbage collected heap  332 . Thread  304  includes a reference  313  to object  338  in the garbage collected heap and a reference  314  to object  336  in the scoped memory area  330 . Thread  306  includes references  316  and  318  to objects  336  and  334  respectively in the scoped memory area. Thread  308  includes a reference  320  to object  334  in the scoped memory area. Thus, thread  302  includes only references to objects in the garbage collected heap. Threads  306  and  308  include only references to objects in the scoped memory area  330 . Thread  304  includes reference to objects in both the garbage collected heap  332  and the scoped memory area  330 . In execution threads  302  and  304  with references to objects allocated in the garbage collected heap  332  will be affected by the periodic processing of the garbage collector in that heap  332 . On the other hand, threads  306  and  308  are not affected by the garbage collector in the garbage collected heap  332  since they have no references to objects in that heap  332 . In contrast, threads  306  and  308  employ scoped memory area  330  that is discardable in dependence on the thread count  350 . 
         [0035]    In accordance with one illustrative embodiment of the present invention, the techniques of garbage collection are further applied to the scoped memory area  330  by way of a scoped memory garbage collector  360 . The scoped memory garbage collector  360  is a software or hardware component of the runtime environment operable to identify and discard unused objects in the scoped memory area  330 . In this way, the advantages of garbage collection are provided for the scoped memory area  330 , and threads that are restricted to using only scoped memory, such as critical real time threads, are able to benefit from garbage collection. 
         [0036]      FIG. 4  is an example flowchart of a method of the scoped memory garbage collector  360  of  FIG. 3  in accordance with one illustrative embodiment of the present invention. At step  402  the method identifies a set of root references for objects allocated in the scoped memory area  330 . Root references are references leading directly or indirectly to objects allocated in the scoped memory area  330 . Such references are normally at the root of a chain of references, such as stored in processor registers, on a software program stack (including local variables and temporaries), and global variables. The identification of a set of root references is inherent in methods of garbage collection and is well known in the art. For example, such an identification will include identifying all software threads having direct or indirect references to objects allocated in the scoped memory area  330 . Thus, an appropriate set of root references for a scoped memory area  330  may include all references in threads having entered the scoped memory area  330 . 
         [0037]    At step  404 , each reference in the set of root references is traversed recursively to identify objects that are allocated in the scoped memory area  330 . Recursive traversal of a reference involves accessing all references stored at a referenced location in a recursive fashion as is undertaken, for example, when fully traversing a linked list or tree data structure. The purpose of the traversal is to identify all objects allocated in the scoped memory area  330  that are referenced from a root reference. When such an object is identified, it is marked. Marking of objects can be undertaken by any suitable fashion, such as by setting a flag within the object itself or by generating or amending an entry corresponding to the object in a separate data structure, such as a table. In this way, all objects in the scoped memory area  330  referenced by the software application in execution (such as via the threads  302  to  308 ) are marked. 
         [0038]    At step  406  the method identifies objects in the scoped memory area  330  that are not marked. The objects identified at step  406  are unused objects—that is, objects to which there exists no identified reference in the software application. The objects identified at step  406  are discarded. Discarding an object can include, inter alia, marking the object as discardable, marking the memory consumed by an object as free memory, or actively deleting the object from memory. 
         [0039]      FIG. 5  is an example block diagram of a scoped memory area  503  in use by a thread  502  in accordance with one illustrative embodiment of the present invention. Thread  502  enters the scoped memory area  503  for the allocation of objects B and A. Other objects C, D, E and F are also allocated in the scoped memory area  503  and are variously referenced and unreferenced. The method of  FIG. 4  will now be applied to the arrangement of  FIG. 5  to illustrate a method of the preferred embodiment of the present invention. 
         [0040]    Initially, at step  402 , a set of root references for all objects allocated in the scoped memory area  503  is identified. This set includes only references in thread  502  since thread  502  is the only thread having references to objects in the scoped memory area  503 . Thus, the set of root references comprises references  510  and  504 . At step  404  the method traverses each of the root reference  510  and  504  and marks objects in the scoped memory area  503 . Thus, traversing root reference  510 , object B is marked since it is allocated in the scoped memory area  503 . The marking of object B is indicated by a tick. Traversing root reference  504  object A is marked since it is allocated in the scoped memory area  503 . The traversal of root reference  504  is recursively performed for reference  506  to object E which is also in the scoped memory area  503  and so is also marked. Further, the traversal of reference  508  to object D which is also in the scoped memory area  503  and so is also marked. Thus, on completion of step  404 , objects B, A, E and D are marked in the scoped memory area  503  since these objects are referenced directly or indirectly from the root references  510  and  504 . Finally, at step  406 , the method identifies objects allocated in the scoped memory area  503  that are not marked. Objects C and F are therefore identified and these objects are discarded. In this way, a process of garbage collection can be applied to the scoped memory area  503 . 
         [0041]    In order to undertake the operations of  FIG. 4  described above, it may be necessary to prevent changes to the references to, and objects within, a scoped memory in order that the scoped memory garbage collector  360  can operate on the scoped memory area  330  in a static state. To achieve this, all threads accessing the scoped memory area  330  are preferably transitioned to a suspended state in which execution of the software threads is stopped. Correspondingly, on completion of the garbage collection process, all threads accessing the scoped memory area  330  are preferably transitioned from the suspend state to an active state. 
         [0042]    Further, on completion of a garbage collection operation it can be preferable to undertake a tidy-up operation on the scoped memory area  330  using compaction. Compaction is a process of moving objects within a memory space such that the memory they occupy is substantially contiguous, leaving relatively large areas of free memory. In contrast, in uncompacted memory, many allocated objects can be widely dispersed leaving many small areas of free memory there-between. Compaction will involve moving objects allocated in the scoped memory area  330  to contiguous (or substantially contiguous) memory locations in the scoped memory area  330 . Additionally, references to each moved object will need to be updated to correspond to a new memory location for the object. This is known as a process of fixing up or modifying references. 
         [0043]    The identification of root references has so far been described in terms of direct or indirect references to a scoped memory area in software threads. However, the rules of scoped memory described above further provide for references from inner scopes to outer scopes. Such references can also be used to indicate that an object allocated in a scoped memory area is used, and these references are therefore important to include in the set of roots. 
         [0044]      FIG. 6  is an example block diagram of nested scoped memory areas  602 ,  604 ,  606  and  608  in accordance with one illustrative embodiment of the present invention. Scoped memory area  602  is a scoped memory area for garbage collection and includes allocated objects G, H, and I. The scoped memory area  602  has further two inner scoped memory areas  604  and  606 . Scoped memory area  604  includes allocated objects J, K, and L. Object J includes a reference to object G and object K includes a reference to object H. Scoped memory area  606  includes allocated object M. Scoped memory area  606  further includes an inner scoped memory area  608  having a single object N. Object N includes a reference to object I in scoped memory area  602 . Thus, the scoped memory area for garbage collection  602  has three inner scoped memory areas: scoped memory area  604 ; scoped memory area  606 ; and scoped memory area  608 . Such inner scoped memory areas are also known as child scoped memory areas since they have parental relationships  620 ,  622  and  624 , with their immediately outer scoped memory areas. In the method of garbage collection of  FIG. 4 , references from objects within these child scoped memory areas are preferably to be included in the set of root references to ensure objects are not discarded from the scoped memory area for garbage collection  602  that are referenced by inner scoped memory areas. 
         [0045]      FIG. 7   a  is an example flowchart of a method for identifying root references to objects allocated in the scoped memory area for garbage collection  602  in accordance with one illustrative embodiment of the present invention. Initially, at step  702 , the method identifies a set of child scoped memory areas of the scoped memory area for garbage collection  602 . The set of child scoped memory therefore comprises scoped memory areas  604 ,  606 , and  608 . Subsequently, at step  704 , the method identifies, in each child scoped memory area of the set, references to objects allocated in the scoped memory area for garbage collection  602 . Thus, references  632 ,  634 , and  636  are identified as references to objects allocated in the scoped memory area for garbage collection  602  and these references are identified as root references at step  706 . In this way, references from inner (child) scopes to outer (parent) scopes can be accommodated during a garbage collection process. 
         [0046]    The step  702  of the method of  FIG. 7   a  requires the identification of a set of child scoped memory areas for the scoped memory area for garbage collection  602 . Where it is impractical or inefficient to identify strictly only, and all, child scoped memory areas, an alternative approximation is suitable for identifying a set of potential child scoped memory areas. 
         [0047]      FIG. 7   b  is an example flowchart of a method for identifying a set of potential child scoped memory areas for the garbage collection  602  of  FIG. 6  in accordance with one illustrative embodiment of the present invention. At step  722  all threads using the scoped memory area for garbage collection  602  are identified. This can be achieved by parsing all threads in an application and, for each thread, searching for a reference to the scoped memory area for garbage collection  602  in a thread scope stack. At step  724 , an identification is made of all scoped memory areas entered by all the identified threads. Subsequently, at step  726 , scoped memory areas that are potential child scoped memory areas of the scoped memory area for garbage collection  602  are identified. It may not be practical or efficient to determine exactly which of the scoped memory areas identified at step  724  is a child of the scoped memory area for garbage collection  602 , but a comparison of the relative depths of each identified scoped memory area and the scoped memory area for garbage collection will give an indication of potential children. This is because child scoped memory areas will always have a depth that is deeper than their parent. In this way, a set of potential child scoped memory areas can be identified for processing in accordance with steps  704  and  706  of  FIG. 7   a.    
         [0048]    It will be appreciated by those skilled in the art that the set of root references identified by the methods of  FIGS. 7   a  and  7   b  will be supplemented by software threads having references to objects in the scoped memory area since these are also root references. Subsequently, the complete set of root references can be applied to the method of  FIG. 4  for the garbage collection of a scoped memory area. 
         [0049]    The aforementioned preferred embodiments provide the advantages of garbage collected memory to a scoped memory area. The garbage collection process can only affect the threads accessing the scoped memory area. The extent of any unfavourable effects of such garbage collection is thus constrained only to those threads accessing the scoped memory area. Since the number of such threads accessing the scoped memory area is typically small (in comparison with all threads in an application), the significance of such effects is also constrained. In spite of this, even these constrained implications of garbage collection in scoped memory areas may not be satisfactory for certain critical real time threads in critical software applications. For example, threads involved in the monitoring or control of critical processes in real time—the delay to which could pose a threat to the successful completion of a process, or to the safety of resources, equipment, or even animal or human life—may not be able to accommodate even the least significant impact of such garbage collection in scoped memory areas. An example of such a thread is a ‘NoHeapRealtime’ thread in the Java runtime environment. 
         [0050]      FIG. 8  is an example flowchart of a method of memory management in a real time runtime environment in accordance with one illustrative embodiment of the present invention. The method of  FIG. 8  seeks to provide the advantages of garbage collection for such critical real time threads. 
         [0051]    Referring to  FIGS. 8 ,  9   a , and  9   b , a critical real time thread  912  is precluded from using a garbage collected heap  332  due to its critical real time nature. Instead, the critical real time thread allocates objects in a scoped memory area  503 . The critical real time thread  912  has associated a garbage collection identifier  914  as a software or hardware identifier for indicating when the critical real time thread  912  can reasonably accommodate a garbage collection process of the scoped memory area  503 . Such a garbage collection process can be carried out in accordance with the methods of  FIGS. 4 ,  7   a , and  7   b , as discussed above. The garbage collection identifier  914  can form part of the critical real time thread  912 , or can be stored separately such as within application data for a runtime execution environment. Further, the garbage collection identifier  914  can be actively set and unset by the critical real time thread  912 . 
         [0052]    Alternatively, a separate thread monitor  902  can be configured to passively monitor the state of the critical real time thread  912  in order to set and unset the garbage collection identifier  914  (see  FIG. 9   b ). For example, the thread monitor  902  can be a software or hardware component of a runtime environment operable to examine the execution profile of the critical real time thread  912  to identify states or phases of execution of the thread when the thread is more able to accommodate a garbage collection process. 
         [0053]    Referring to the method of  FIG. 8 , initially, at step  802 , the critical real time thread  912  is in execution using a scoped memory area  503 . At step  804  the method determines if the garbage collection identifier  914  indicates that the critical real time thread  912  is able to accommodate a garbage collection process. If the garbage collection identifier  914  indicates that the critical real time thread  912  is unable to accommodate a garbage collection process, the method returns to step  802 . Alternatively, if the garbage collection identifier  914  indicates that the critical real time thread  912  is able to accommodate a garbage collection process, the method proceeds to step  806  where the garbage collection process is undertaken for the scoped memory area  503  (such as in accordance with the method of  FIG. 4 ). In this way, the undertaking of a garbage collection process of the scoped memory area  503  is constrained to only those times when the critical real time thread  912  is able to accommodate such a process as indicated by the garbage collection identifier  914 . 
         [0054]    Insofar as embodiments of the invention described are implementable, at least in part, using a software-controlled programmable processing device, such as a microprocessor, digital signal processor or other processing device, data processing apparatus or system, it will be appreciated that a computer program for configuring a programmable device, apparatus or system to implement the foregoing described methods is envisaged as an aspect of the present invention. The computer program may be embodied as source code or undergo compilation for implementation on a processing device, apparatus or system or may be embodied as object code, for example. 
         [0055]    Suitably, the computer program is stored on a carrier medium in machine or device readable form, for example in solid-state memory, magnetic memory such as disk or tape, optically or magneto-optically readable memory such as compact disk or digital versatile disk etc., and the processing device utilises the program or a part thereof to configure it for operation. The computer program may be supplied from a remote source embodied in a communications medium such as an electronic signal, radio frequency carrier wave or optical carrier wave. Such carrier media are also envisaged as aspects of the present invention. 
         [0056]    It will be understood by those skilled in the art that, although the present invention has been described in relation to the above described example embodiments, the invention is not limited thereto and that there are many possible variations and modifications which fall within the scope of the invention. 
         [0057]    The scope of the present invention includes any novel features or combination of features disclosed herein. The applicant hereby gives notice that new claims may be formulated to such features or combination of features during prosecution of this application or of any such further applications derived therefrom. In particular, with reference to the appended claims, features from dependent claims may be combined with those of the independent claims and features from respective independent claims may be combined in any appropriate manner and not merely in the specific combinations enumerated in the claims.