SlideShare a Scribd company logo
1 of 8
Download to read offline
 
      Efficient Memory-Reference Checks for Real-time Java

                                                     Angelo Corsaro and Ron K. Cytron
                                              Department of Computer Science and Engineering
                                                           Washington University
                                                        St. Louis, MO, 63130, USA
                                                            ¡
                                                      corsaro, cytron @cse.wustl.edu¢



ABSTRACT                                                                                1. INTRODUCTION
The scoped-memory feature is central to the Real-Time Specifica-                            One of the main hurdles for making Java     ¤ ¥£  [1] usable for the
tion for Java. It allows greater control over memory management,                        development of real-time systems has been the fact it is a garbage-
in particular the deallocation of objects without the use of a garbage                  collected language. While developers generally like the functional-
collector. To preserve the safety of storage references associated                      ity provided by garbage collection, they object to those aspects of
with Java  ¤ ¥£ since its inception, the use of scoped memory is con-                   garbage collection that could introduce unpredictable delay into an
strained by a set of rules in the specification. While a program’s                       application.
adherence to the rules can be partially checked at compile-time, un-                       At one extreme, some collectors work in a stop the world and
decidability issues imply that some—perhaps, many—checks may                            collect fashion, in which the garbage collector has to stop all the
be required at run-time. Poor implementations of those run-time                         running threads before attempting to reclaim dead storage. Other
checks could adversely affect overall performance and predictabil-                      types of garbage collectors take a less restrictive approach, but most
ity, the latter being a founding principle of the specification.                         of the precise garbage collectors known in literature [10] are not
   In this paper we present efficient algorithms for managing scoped                     suitable for real-time systems.
memories and the checks they impose on programs. Implementa-                               Recently, garbage-collection algorithms have been described that
tions and results published to date require time linear in the depth                    reasonably bound the delay experienced by an application [5, 2].
of scope nesting; our algorithms operate in constant time. We de-                       However, those algorithms require an extra processor, extra heap
scribe our approach and present experiments quantifying the gains                       space, or both—luxuries that may not be available on a cost com-
in efficiency.                                                                           petitive, embedded, real-time system. Thus, the expert group that
                                                                                        designed the Real-Time Specification for Java (RTSJ) [4] decided
Categories and Subject Descriptors                                                      to provide a memory management scheme that would allow pro-
                                                                                        grammers to circumvent the garbage collector, giving them control
D.3.3 [Programming Languages]: Language Construct and Fea-                              over the time at which memory is allocated and reclaimed, while at
tures—dynamic storage management, constraints; D.2.8 [Software                          the same time retaining the storage-referencing safety properties of
Engineering]: Metrics—complexity measures, performance mea-                             a garbage-collected language.
sures                                                                                      A programming language with safe storage references denies ac-
                                                                                        cess to storage that is dead or that has been reallocated for other
General Terms                                                                           purposes. Languages like C++ allow explicit control of object allo-
                                                                                        cation and deallocation, yet they provide no mechanism for check-
Algorithms, Performance, Design
                                                                                        ing safe storage references. If RTSJ had adopted the approach of
                                                                                        C++, then unsafe storage references would go unchecked, violating
Keywords                                                                                a principle design force for Java ¤ ¥£.
Real-Time Java, Object Oriented Languages, Scoped Memory, Garbage                          The RTSJ, as described in Section 2, extends the Java memory
Collection, Memory Management                                                           model by providing several kinds of memory areas other than the
                                                                                        traditional, garbage-collected heap. These memory areas have dif-
                                                                                        ferent properties in term of the lifetime of objects allocated within
                                                                                        them, and in term of the timing guarantees for object allocation and
                                                                                        deallocation.
                                                                                           In particular, the scoped memory area provides a heap-like area
    Sponsored by DARPA under contract F33615-00-C-1697                                  for object allocation. However, garbage collection does not deter-
                                                                                        mine when objects in a scoped memory area are dead. Instead, the
                                                                                        entire scope can be collected when all threads that have entered the
                                                                                        area (by invoking a particular method on the area) have apparently
Permission to make digital or hard copies of all or part of this work for               abandoned the area (by exiting the method invoked to gain entry).
personal or classroom use is granted without fee provided that copies are               Unfortunately, a thread that has left a scoped memory area could
not made or distributed for profit or commercial advantage and that copies
                                                                                        yet possess references into that area. Threads could also develop
bear this notice and the full citation on the first page. To copy otherwise, to
republish, to post on servers or to redistribute to lists, requires prior specific       references to scoped memory areas for which they have never for-
permission and/or a fee.                                                                mally declared their intention to use.
LCTES’03, June 11–13, 2003, San Diego, California, USA.                                    Thus, the undisciplined use of the RTSJ could lead to dangling
Copyright 2003 ACM 1-58113-647-1/03/0006 ...$5.00.
references that would never occur in standard Java       . To avoid
                                                              ¤ ¥£                          For JVM and application developers alike, scoped memory is
this problem, the RTSJ comes with a a set of rules that must be                          one of the more interesting features added to Java  ¤by the RTSJ.
                                                                                                                                               ¥£
enforced—at runtime if necessary—by every compliant Java Vir-                            Object allocated within a scoped memory are not garbage collected;
tual Machine (JVM). These rules substitute a runtime exception in                        instead, a reference-counting mechanism detects when all objects
place of an unsafe reference.                                                            in a scope should be collected. Safety of scoped memory areas is
   To summarize, scoped memory areas are a compromise for Java                    ¤ ¥£   ensured by reliance upon (1) a set of rules imposed on entrance of
and real-time developers, offering some control over storage deal-                       scoped memories, and (2) a set of rules that govern the legality of
location while ensuring that unsafe references are checked and re-                       reference between objects allocated in different memory areas. The
ported as such. At issue is the expense of implementing the checks                       remainder of this section concerns memory areas and will provide
necessary for compliance with the RTSJ.                                                  an explanation of its mechanics.
   This paper focuses on the data structure and the algorithms used
to implement the RTSJ memory model and to enforce the safety                             2.1 Understanding the Scoped Memory Model
rules. The main contribution of this paper is that of showing how                          To understand the mechanics of scoped memory areas, it is im-
all the necessary runtime checks can be performed in constant time,                      portant to understand the RTSJ rules that govern access to those ar-
by either using more efficient data structures than those proposed                        eas. RTSJ assumes that Java  ¤ £has its traditional threads, but adds
by the RTSJ or by using analogies with problems that arise in type                       two new real-time thread types: RealtimeThread and NoHeap-
inclusion testing [12].                                                                  RealtimeThread, with access rules as follows:
   The remainder of the paper is organized as follows, Section 2
contains an in depth description of the RTSJ memory model and of                            1. A traditional thread can allocate memory only on the tradi-
the implementation techniques currently used; Section 3 presents                               tional heap.
our improvements, showing how the RTSJ memory model can be
implemented efficiently by using better data structures and algo-                            2. Real-time threads may allocate memory from a memory area
rithms; Section 4 presents the results of performance analysis that                            other than the heap by making that area the current allocation
compares the performances of the algorithms proposed in this paper                             context.
with those suggested by the RTSJ and used in literature. Section 5                          3. A new allocation context, or scope, is entered by calling the
provides an outline of the state of the art and related work; finally                           MemoryArea.enter() method or by starting a real-time
Section 6 contains our concluding remarks.                                                     thread whose constructor was given a reference to an instance
                                                                                               of MemoryArea. Once a scope is entered, all subsequent
2.      THE RTSJ MEMORY SUBSYSTEM                                                              uses of the new keyword, within the program logic, will al-
   The RTSJ extends the Java memory model by providing mem-                                    locate the memory from the current scope. When the scope
ory areas other than the heap. As shown in Figure 1, these memory                              is exited by returning from the enter() method, all subse-
areas are characterized by the anticipated lifetime of the contained                           quent uses of the new operation will allocate memory from
objects (immortal, scoped) as well as the time taken for allocation                            the memory area associated with the enclosing scope.
(linear, variable). Objects allocated within the (singleton) Immortal
                                                                                            4. A real-time thread is associated with a scope stack containing
                               MemoryArea                                                      all the memory areas that the thread has entered but not yet
                                                                                               exited.

                                                                                           On the other hand, the rules that govern the scoped memory be-
     ImmortalMemory   ScopedMemory   ImmortalPhysicalMemory          HeapMemory
                                                                                         havior are the following:

                                                                                            1. Each instance of the class ScopedMemory must maintain
      VTMemory    LTMemory    LTPhysicalMemory     VTPhysicalMemory
                                                                                               a reference count of the number of threads active in that in-
                                                                                               stance.
    Figure 1: Hierarchy of Classes in the RTSJ Memory Model
                                                                                            2. When the reference count for an instance of the class Scoped-
Memory have the same lifetime as the application: they are never                               Memory is decremented from one to zero, all objects within
collected. Each Scoped memory area is equipped with a reference                                that area are considered unreachable and are candidates for
count of the number of threads active in its area. The lifetime of                             reclamation. The finalizers for each object in the memory as-
objects allocated in such an area is keyed to the reference count.                             sociated with an instance of ScopedMemory are executed
Figure 1 includes the LTPhysicalMemory and VTPhysical-                                         to completion before any statement in any thread attempts to
Memory areas, which afford raw access to specific locations in an                               access the memory area again.
address space. We mention the physical memory areas for com-
                                                                                            3. Each ScopedMemory has at most one parent, defined as
pleteness; it is their scoped nature that is relevant to the work pre-
                                                                                               follows. For a ScopedMemory that has been pushed on a
sented in this paper.
                                                                                               scope stack, i.e., entered by at least one thread, its parent is
   Additionally, scoped memory areas provide bounds on the allo-
                                                                                               the first instance of ScopedMemory below it on the scope
cation time; currently, variable (VTMemory) and linear-time (LT-
                                                                                               stack, if there is one; otherwise, its parent is the primordial
Memory) allocators are accommodated. For linear allocation time,
                                                                                               scope. For as scope not pushed on the scope stack, its parent
the RTSJ requires that the time needed to allocate the           bytes¤¢ 
                                                                     £ ¡                       is null.
to hold the class instance must be bounded by a polynomial func-
tion   ¨ §¥
         © ¦     for some constant     
                                        £ ¡   .1                                                                                             
                                                                                            Figure 2 depicts three scoped memory areas, , , and , and
1                                                                                                               !
                                                                                         two real-time thread , and    
                                                                                                                         . In Figure 2,        !
                                                                                                                                        enters , , and
 This bound does not include the time taken by an object’s con-
structor or a class’s static initializers.                                                                  
                                                                                         then tries to enter , while     #     
                                                                                                                        enters , , and then tries to enter
. In Figure 2, circles represents scoped memories while arrows                                            Algorithm 1: checkSingleParentRule
point from a child scope to its parent scope.                                                                  Input:   § ©§¥£
                                                                                                                        ¤ ¢¨ ¦¤    ma,                '%$#!¤ ¨
                                                                                                                                                            
                                                                                                                                                    scopeStack
        
    If , as shown in Figure 2, tries to enter after        has entered                   #                   Output: boolean isSingleParentRuleOK
it, than a compliant RTSJ JVM will detect a violation of the single
                                                                                                               begin
parent rule and throw an exception. This violation, as visible in
Figure 2 by the contents of the scope stack of         and , can be              !            #                  isSingleParentRuleOK true;            (
detected by a JVM inspecting the scope stack and checking that no
                                                                                                                   if ma instanceOf              !©§1%0¤ ¨
                                                                                                                                                 ¢¨ ¦¤ £) 
                                                                                                                                                   then
single-parent rule violation happens.
                                                                                                                                 2
                                                                                                                       parent findFirstScope scopeStack);                               ¦
    Why is this single-parent rule necessary? The single parent rule
                                                                                                                                             2
                                                                                                                       if ma.parent nil or ma.parent parent then                            2
guarantees that once a thread has entered a set of scoped memory
                                                                                                                            ma.parent parent ;   (
                                                                                                                            scopeStack.push ma ;            ¦              ©
in a given order, any other thread will have to enter them in the
same order, up to the point at which the reference count for all
                                                                                                                                                     (
                                                                                                                            ma.refCount ma.refCount 1;                                          3
these memory drops to zero. At that point, a new nesting will be                                                       else
possible. This requirement guarantees that a parent scope will have                                                         isSingleParentRuleOK false ;                       (
a lifetime that is at least that of any of its child scopes, making it
safe for objects in a descendant scope to reference objects in an                                                end
ancestor scope.
                                                                                                             Algorithm 2: findFirstScope
    A
                    T1
                                                  A

                                                        T2
                                                                             A                      A          Input:          '%$#!¤ ¨
                                                                                                                                  
                                                                                                                                    scopeStack

    B       1
                A   A
                             2
                                 A
                                                                 3           B        T1            C   T2
                                                                                                               Output:  !7§¥%§65'4
                                                                                                                        ¢¨ ¦¤ £)¤ ¨    firstScope
                    T2                   T1       C      C
                                                         A
                                                                                                               begin
    C           A   A            B       B
                                                                                      C
                                                                                      B
                                                                                                        B
                                                                                                        C
                                                                                                                   firstScope       (
                                                                                                                                  PrimordialScope ;
                                         A                                   C
                                                                                      A
                                                                                                    B
                                                                                                        A          for                    ( 48
                                                                                                                             scopeStack.size()  downto          @ A9                                £   do
                                                                                                                         DC8 B
                                                                                                                       if scopeStack instanceOf                                        !©§1%§6¨4
                                                                                                                                                                                       ¢¨ ¦¤ £)¤           then
            Figure 2: The scope stack and the single parent rule.                                                            (
                                                                                                                            firstScope   scopeStack ;                                              DC8 B
                                                                                                                            break ;
   Figure 3 extends the example of Figure 2, showing a potential
scope tree of an RTSJ application; all nodes of that tree represent                                              end
scoped memory areas. An object in node of such a tree can ref-   ¡
                                     ¢
erence an object in node only if is an ancestor of . Thus,   ¢                                  ¡
the curved arrows in Figure 3 show some (not all) legal references,
while the zig-zag arrows represent some (not all) illegal references.                                        2.2 RTSJ Suggested Runtime Check Imple-
   With the single-parent rule, the ancestor relationship described                                              mentation
above guarantees that legal accesses occur only from a scope to                                                 We next present the current state of algorithms for scope and ref-
another at least as long-lived as the former. In other words, no legal
                                                                                                             erence checks, as suggested by the RTSJ and its current implemen-
references are “dangling.”                                                                                   tations [11, 3]. we provide examples that explain why this approach
   To enforce the rules, a compliant JVM has to check every attempt                                          is not satisfactory for real-time applications.
to enter a memory area by a thread, to ensure that the single parent
rule is not violated, and it has also to check the creation of reference                                      2.2.1 Data Structures
between objects belonging to different memory areas. Since object                                               The RTSJ assumes that (1) there is a scope stack associated (at
references occur frequently in Java         programs, it is important to
                                                      ¤ ¥£                                                   least logically) with each real-time thread, (2) each memory area
implement them efficiently and predictably.                                                                   keeps a reference to its parent, (3) scoped memories keep track of
                                                                                                             their reference count, and (4) for any object, it is possible to obtain
                                                  A                                                          a reference to the memory area that contains it. The algorithms
                                                                                                             used to enforce the single-parent rule and the assignment rules are
                                                                                                             based on these data structures.

                                 B                                   F                                        2.2.2 Single Parent Rule
                                                                                                                The single parent rule is enforced at the point a real-time thread
                                                                                                                                         E                             E
                                                                                                             tries to enter a scope . At that time, if has no parent, then entry is
                                              E                  G
                                                                                                             allowed. Otherwise, the thread entering must have entered every       E
                         C
                                                                                                                                     E
                                                                                                             proper ancestor of in the scope tree. Algorithm 1 and Algorithm 2
                                                                                                             contain the pseudocode that performs this test.
                                                                                                                Examination of these algorithms reveals a time complexity of

                         D                                           H
                                                                                                             © ¨ ¦ F       
                                                                                                                     where represents the depth of the stack.
                                                                                                              2.2.3 Memory Reference Checks
                                                                                                                The rules that govern the validity of references across memory
Figure 3: Scope Tree and Scoped Memory Reference Checking
                                                                                                             areas can be summarized as follows:
Sample.
                                                                                                                  1. A reference to an object allocated in a ScopedMemory can
                                                                                                                     never be stored in an object allocated in the Java heap or in
                                                                                                                     the immortal memory.
Algorithm 3: checkReferenceValidity                                                                                Algorithm 5: checkReferenceValidity2
  Input:    0!  !7§¥£
            ¤ ¢¨ ¦¤             from,                    to,                        §!  !701£
                                                                                      ¤ ¢¨ ¦¤                      Input:    § ©§¥£
                                                                                                                               ¤ ¢¨ ¦¤       from, § !©§1£
                                                                                                                                                      ¤ ¢¨ ¦¤    to
                 $465'4
                      ¤ ¨scopeStack                                                                               Output: boolean validReference
  Output: boolean validReference                                                                                     begin
  begin                                                                                                                  validReference true;
                                                                                                                                  ¡2         (
      validReference true;
                   ¡2                          (                                                                         if from to then
      if from to then                                                                                                         if to instanceOf         !7§¥%§65'4
                                                                                                                                                       ¢¨ ¦¤ £)¤ ¨
                                                                                                                                                                 then
           if to instanceOf                     then             !©§1%§6¨4
                                                                 ¢¨ ¦¤ £)¤                                                                    ¢¨©§¤¥%§65'4
                                                                                                                                                   ¦ £)¤ ¨
                                                                                                                                   if from instanceOf                  then
                if from instanceOf                      !701%§65'4
                                                        ¢¨ ¦¤ £)¤ ¨
                                                     then                                                                               ancestor
                                                                                                                                             ¡2                      (¡
                                                                                                                                                     from.getParent();
                     toDepth depth to, scopeStack ;©                   ¦               2                                                                                2
                                                                                                                                        while to ancestor and ancestor nil do
                     if toDepth         then                                 §¥¤£2
                                                                             ¦¢                                                            ancestor              (
                                                                                                                                                        ancestor.getParent();
                                                                                                                                                                          ¡2
                          validReference false;                      (                                                                   if to ancestor then
                     else                                                                                                                                  (
                                                                                                                                              validReference false;
                          fromDepth       depth from, scopeS-  ¦           2                                                      else
                          tack ;                                                         ©
                          deltaDepth toDepth fromDepth ;     9           2                                                               validReference       (
                                                                                                                                                           false;
                          if not     deltaDepth      © ¦§¤¨
                                                      then ¢                    ¨ © ¦£
                              validReference false;              (                                                     end

                   else
                                    validReference                  (       false;                                 time applications inevitably contain code fragments whose exe-
                                                                                                                   cution time must be statically known. The scope stacks for an
  end                                                                                                              application—in particular, their depth—are not necessarily decid-
                                                                                                                   able at compile-time. Thus, linear-time algorithms for checking
                                                                                                                   the single-parent rule and the memory references may incur unpre-
Algorithm 4: depth
                                                                                                                   dictable overhead. As a result, the application must either overpro-
  Input:    0!  !7§¥£
            ¤ ¢¨ ¦¤    ma,           scopeStack                 #65'4
                                                                      ¤ ¨                                       vision, thus wasting resources, or else underprovision, and perhaps
  Output: int depth                                                                                                miss a critical deadline.
  begin                                                                                                               Moreover, the time spent checking a given memory reference
      depth       ;¤(
                   ¦¢                                                                                              using the above algorithms will vary depending on the particular
               (
      index scopeStack.size() - 1;                                                                                 scope stack in place when the check is performed. Even a simple
      while index     and scopeStack index
                                    £ ¡     ma do                                    B     ¡2 C                   store instruction will thus take varying amounts of time depending
         index     index   ;(                      @ A9                                                            on the scope stack. This in prevents analysis of the code’s timing in
                                                                                                                   any particular context, but makes it necessary to analyze its timing
          if scopeStack index ma then      B              2C                                                       in all the different contexts in which it could be executed. In our ex-
                                (
              depth scopeStack.size() index                                       9         @ A9   ;
                                                                                                                   perience in developing an Object Request Broker (ORB) for RTSJ,
  end                                                                                                              such unpredictability makes it impossible to bound reasonably the
                                                                                                                   time for servicing clients’ requests.

   2. A reference to an object allocated in a ScopedMemory                                                     ¦   3. OPTIMIZING THE RTSJ MEMORY SUB-
      can only be stored in objects allocated in a ScopedMemory
                       
        only if is a descendant of ; note that the case       is        ¦                              ¦ 2           SYSTEM
      thus allowed.                                                                                                   We have thus far described the checks required by a compliant
                                                                                                                   RTSJ implementation, and we have explained why the algorithms
The RTSJ specification does not explicitly provide an algorithm for                                                 currently present in literature [4, 3, 11] are not ideal for real-time
checking the legality of a memory reference, but two approaches                                                    applications. We next show how to extend the data structures used
could potentially be taken. In one approach [11, 3], essentially fol-                                              by the RTSJ to perform all required checks in constant time. Our
lowing the advice given in the RTSJ specification, a thread’s scope                                                 approach is inspired and based upon type-inclusion tests for single-
stack can be scanned to ensure that the memory area from which                                                     inheritance, object-oriented languages [12].
we are creating a reference was pushed later than the memory area                                                     We have implemented the algorithms described here in the jRate
of the reference’s target. This approach is described by the Algo-                                                 [8] memory subsystem; for convenience, we describe our approach
rithm 3 and Algorithm 4. By inspection of the pseudocode, this                                                     in the context of jRate.
check has time complexity                           © §¨ ¦ F
                                    where is the depth of the scope                                                3.1 Optimizing the Singe Parent Rule Check
stack.
   We present a slightly more efficient variation in Algorithm 5.                                                      jRate’s scope-stack implementation uses data structures that al-
This algorithm, based on the observation that reference from scoped                                                low all scope stack operations to be performed in constant time.
memory to heap or immortal memory are always legal, and the op-                                                    As shown in Figure 4, jRate augments the scope-stack data struc-
posite is always illegal, avoids scanning the scope stack, and simply                                              ture suggested by RTSJ, linking those slots that represent scoped
follows a scope’s parent link to discover if the target reference is in                                            memory areas. An index is also maintained to the topmost scoped
an ancestor scope of the source.                                                                                   memory, so that the next scoped memory area pushed onto the stack
   It is well known that for real-time applications, it is important to                                            can be linked with the others.
be able to put bounds on the execution of operations within some                                                      This design allows a constant-time implementation of     '' 8 )   8 ¥
                                                                                                                                                                               9E 
piece of code, and for code within a whole application. Real-                                                       ¦© 65'4
                                                                                                                   ¤ ¨    , while at the same time maintaining constant-time bounds
Top                                                                                                         H
                                                       Scoped
                                                       Memory
                                                       Top


                                                                                                                      A




                                                                                                          H                           F


        Bottom

                                                                                                          B                           I           I
               Scoped Memory

               Non-Scoped Memory

                                                                                                  H           E                       G           H
              Figure 4: The jRate Scope Stack structure.

Algorithm 6: findFirstScope
  Input:              ss                 $465'4
                                              ¤ ¨                                              C               I                   L
  Output:                       !©§1%§6¨4
                                ¢¨ ¦¤ £)¤ 
                           firstScope
  begin
      firstScope  ¤65'4D¡ 8 !©¦   (
                     ¨    ) ¨¡ 8   ;                                                             I
            §¨¥¦¤ ¢£§12
      if ss.lastSMIndex               then
          C
          firstScope            B (
                       ss ss.lastSMIndex .ma ;
  end
                                                                                                  D


for© §E 
     ¦ ©   and       .                     ¦© 5¨                     Figure 5: A sample Scope Tree structure (Grey nodes represent
   Algorithm 6 provides the pseudocode for the constant-time im-
plementation of   ¦© ¤65'4 ' 8 )   8 ¥
                         ¨ E         , while Algorithm 7 and Al-       the Heap(H), and Immortal (I) Memory).
gorithm 8 provide the pseudocode for the           and E 
                                                         
                                                        ©      5¨ 
                                                              opera-
tions. On inspection it can be seen that all of these operation are
performed in constant time. As compared with the RTSJ-inspired
implementations, no scanning of the scope stack is required.
   The actions required for processing memory areas require know-
                                                                                                                                                              depth = 0
ing what kind of memory area is at-hand (immortal, scoped, etc).                                                              A
While such information could be determined by Java           ’s in-
                                                                ¤ £                                           A
stanceof test, that test may require time linear in the depth of
the program’s class hierarchy. Instead, jRate] optimizes such tests
by tagging memory area objects to allow a constant-time test.                                                                                                 depth = 1
   This enhancement of the scope stack structure makes it possi-                                      B                                       F
ble to know exactly which entries of the scope stack are scoped                       A       B                                       A   F
memories and which are not. This knowledge enables it to elide
a test on the type of memory area, and avoids blindly searching
for scoped memories on the stack to decrement the reference count
when destroying the scope stack. As a final note, the size of a jRate                                                                                          depth = 2
                                                                                          C                       E                           G
real-time thread’s scope stack can be fixed at thread-creation time.
This design makes jRate more space efficient by avoiding the use           A   B   C                   A   B   E                                   A   F   G
of pointers to implement the linked list.

3.2 Optimizing the Memory Area Reference                                                                                                                      depth = 3
    Check                                                                                 D                                                   L
                                                                                                                          A       F   G   L
   To understand the main idea behind our technique for imple-
                                                                          A   B   C D
menting the reference checks in constant time, consider a generic
scope stack tree, such as the one in Figure 5. In this example, some
of the memory areas are scoped and some are not. The scope stack         Figure 6: Transformed and Decorated Scope Tree structure.
of any running real-time thread can be represented as a path from
the root down to some interior or leaf note. As stated in Sec-
Algorithm 7: Push                                                       This avoids the need to map a storage area to a unique number and
  Input:                    #65'4 0!  !7§¥£
                         ma,    ¤ ¨  ss          ¤ ¢¨ ¦¤           improves the efficiency of our algorithms.
  begin                                                                    For example, if we consider the scoped memory in Figure 6,  
      if ma instanceOf      ©§¥%§65'4
                            ¢¨ ¦¤ £)¤ ¨
                                      then                                                
                                                                        its depth will be and its display will be             ©   ¦
                                                                                                                              . Notice that
                                                                                                                               ¡   ¡




          if ma.getParent()      then 8   2                             the depth is the same as the display length minus one, so an imple-
               ma.setParent(findFirstScope(ss ));                       mentation won’t necessarily need to store this information twice.
                                                                        Here we treat them separately only to simplify exposition of our
          else                        ¡2                                algorithms. Algorithm 9 contains the pseudocode that shows how,
               if ma.getParent() findFirstScope(ss )
                                                                        with these extensions, it is possible to perform the memory refer-
               then
                                                                        ence check in constant time. In this algorithm it is assumed that
                 8¨  ' ¡ ¤ ¤    ¢  §65'4
                       ¤
                   throw                   )¤ ¨
                                           ;
                                                                        both the heap and the immortal memory have a depth of        .     @ A9
               ss.top   ss.top  ;            @3           (
               ss ss.top .ma   ma ;                ( C B                Algorithm 9: checkReferenceValidity
               ss ss.top .prevSM         (
                                    ss.lastSMIndex ;  C B                 Input:  § ©§¥£
                                                                                  ¤ ¢¨ ¦¤        from,          § !©§1£
                                                                                                                   ¤ ¢¨ ¦¤
                                                                                                                      to
               ss.lastSMIndex ss.top ;          (                         Output: boolean validReference
        else
                                                                          begin
               ss.top   ss.top         ;     @3         (                     validReference false;(
               ss ss.top .ma          ma ;        ( C B                       if from.depth to.depth then
                                                                                              ¢




  end                                                                              if to.depth    @ A9 2
                                                                                                       then
                                                                                        validReference true;   (
Algorithm 8: Pop                                                                   else
  Input:             ss                      $465'4
                                                  ¤ ¨                                                   B
                                                                                        if from.display to.depth  to then2C
  begin
                                                                                             validReference true;    (
                 ¢¨©§¤¥%)§65'4
                    ¦ £ ¤ ¨
      if ss ss.top .ma instanceOf              C B
                                             then
                                                                          end
               B
          ss.lastSMIndex            (
                                  ScopedMemory ss.top
           .prevSM ;                                     C
        ss.top        ss.top      ;   @ A9            (                    Finally, we note that the management of displays does not add
                                                                        considerable complexity when entering or exiting a memory area.
  end
                                                                        When a scoped memory is entered for the first time, or after its
                                                                        reference count has dropped to zero, setting up the display simply
                                                                        requires copying the parent’s display and adding itself at the end.
tion 2.2.3, references can always be made from objects in a scoped
                                                                        The only operation required when the last thread leaves the scoped
memory to object in the heap or immortal memory; the opposite is        memory is to invalidate the display.
never allowed. Also, the ancestor relation among scope memory
                                                                           In summary we have described a constant-time algorithm that of-
areas is defined by the nesting of the areas themselves; interven-
                                                                        fers far greater predictability and asymptotic efficiency over the ap-
ing entry into the heap or immortal memory areas do not affect
                                                                        proach currently implemented for RTSJ. We next explore the prac-
the scopes. We call the tree implied by the scoped memory areas’
                                                                        tical efficiency of our approach.
ancestor relation the parenthood tree. For instance, collapsing all
the nodes that represent either the heap or immortal memory in the
scope tree of Figure 5, we obtain the tree depicted in Figure 6. In     4. PERFORMANCE EVALUATION
                                                     
this tree, a direct edge from node to node , means that is the            We next present the results of a performance comparison be-
parent of .                                                            tween the memory-reference checking scheme proposed in this pa-
   The advantage of this formulation is that subtype-testing algo-
                                                                        per and the one proposed by the RTSJ. Below we describe the
rithms [12] can be applied to the parenthood tree to determine legal
                                                                        testbed, the tests performed, and the results obtained.
references.
   Relying on this observation, we can use a technique based on
displays, similar to that proposed by Cohen [12], to determine the
                                                                        4.1 Testbed
validity of a memory reference in constant time. The parenthood            The platform used for running the test was a Pentium III, 733 MHz
tree can change with time, since the scopes’ parent-child relation      processor with 256 MB of RAM, running Linux RedHad 8.0 with
changes as the application runs and scoped memory areas are en-         the kernel v2.4.18–24.8.0. The latest version of jRate, which is
tered and exited. Thus, the associated type hierarchy is not fixed,      available at http://tao.doc.wustl.edu/˜corsaro/jRate
but changes at well-defined points—when the reference count of a         was used in the performed test. jRate [8] is an open-source RTSJ-
scoped memory goes from zero to one or from one to zero. At such        based real-time Java implementation currently under development
points, the typing information associated with a scoped memory          at Washington University. jRate extends the open-source GNU
has to be created and destroyed, respectively.                          Compiler for Java (GCJ) runtime system [9] to provide an ahead-
   To facilitate a constant-time memory-reference check, we aug-        of-time compiled middleware platform for developing RTSJ-compliant
ment the information associated with a scoped memory to include         applications.
its depth in the parenthood tree and a display that contains the type
identification codes of its ancestors in the parenthood tree.            4.2 Timing Measurements
   The address of a scoped area serves nicely as a unique type iden-       An issue that arises when conducting benchmarks concerns the
tifier, thanks to the single-parent rule: once a scoped memory area      timing mechanism that provides the results. To ensure precise mea-
is reclaimed, no memory area can store its address in its display.      surements we used our own native timers, which, on all Pentium-
based systems, rely on the read-time stamp counter RDTSC 2 in-                                                                                   Display      Parent Traversal      Delta      Speedup
                                                                                                                                                        0   48.460 ns         70.830 ns       22.370 ns     1.461
            struction [6] to obtain timing resolution in terms of the CPU clock
                                                                                                                                                        1   57.011 ns         71.270 ns       14.259 ns     1.250
            period.                                                                                                                                     2   57.011 ns         78.394 ns       21.382 ns     1.375
                                                                                                                                                        4   57.011 ns         86.948 ns       29.937 ns     1.525
            4.3 Test Description and Results                                                                                                            8   57.011 ns        121.149 ns       64.138 ns     2.125
               To compare the performance of our approach against that of                                                                              16   57.011 ns        155.366 ns       98.355 ns     2.725
            other systems based on the RTSJ, we implemented both algorithms                                                                            32   57.017 ns        222.351 ns       165.334 ns    3.899
            in jRate. Other RTSJ systems to-date follow Algorithm 3—scanning                                                                           64   57.011 ns        359.178 ns       302.166 ns    6.300
            the scope stack to determine the validity of a reference check. But,
            if the               tests can be carried out in constant time3 , then
                      ¥ §'   $ E   8
                        ¨¤                                                                                                                                    Figure 8: Average reference check time.
            Algorithm 5 is more efficient since there is no need to scan the
                                                                                                                                                  stant time, regardless of the depth of the scope stack. The display
            scope stack. Instead, the scope hierarchy is consulted. We there-
                                                                                                                                                  based algorithm, not only provides average constant time checks,
            fore implemented and compared the better Algorithm 5 with our
                                                                                                                                                  but its worst case performance indexes, i.e., 99% and max, are very
            display-based approach as described by Algorithm 9.
                                                                                                                                                  closely bound—practically identical—to the average.
               Both algorithms are implemented in C++, on the native side of
                                                                                                                                                     Note that the results provided by this test also predict the timing
            jRate. To better estimate the performance of the two algorithms,
                                                                                                                                                  behavior of these algorithms for invalid memory references. For
            and to avoid the overhead and interference of Cygnus Native In-
                                                                                                                                                  the display-based approach, the time taken to detect a valid or an
            terface (CNI), we instrumented the native code directly to measure
                                                                                                                                                  invalid reference is the same, and does not depend on the structure
            times for both approaches.
                                                                                                                                                  of the parenthood tree. On the other hand, if we consider the parent-
               In order to compare the efficiency of the different memory ref-
                                                                                                                                                  traversal algorithm, the time necessary for detecting an invalid ref-
            erence algorithms, we extended the RTJPerf4 [7] benchmarking
                                                                                                                                                  erence (in the case of two scoped memories) requires traversing
            suite, with a test that creates a reference from a scoped memory                                                                     the parents path to the root. Thus, results shown in Figure 7, and
            to a scoped memory ; where is the                  
                                                            ancestor of , i.e., an                                                             Figure 8 essentially determine the time taken to check an invalid
                                                             
            ancestor that has a distance of from . The values of consid-                                                                         reference when the    ! ¥
                                                                                                                                                                        ¦¨                                       
                                                                                                                                                                              scoped memory has a distance of from
            ered were 0, 1, 2, 4, 8, 16, 32, and 64. The time for performing the
                                                                                                                                                  the root of the parenthood tree.
            reference check was computed as the average of 2000 samples.

            400
                                   Average
                                                                         400
                                                                                                              99%                                 5. RELATED WORK
            350                                                          350                                                                         Most of the work available in literature, which addresses the im-
            300                                                          300                                                                      plementation of the RTSJ memory subsystem, such as [11], and
            250                                                          250                                                                      [3], use the same algorithms proposed by the RTSJ, by scanning
Time (ns)




            200                                                          200                                                                      the scope stack, in order to perform the memory reference checks.
            150                                                          150                                                                      Thus, all these works provide    © ¨ ¦ F
                                                                                                                                                                                         algorithms for checking both
            100                                                          100                                                                      the single parent rule and the memory reference checks.
             50                                                           50                                                                         Some of the work present in literature, on compositional pointer
                                                                           0                                                                      and escape analysis, such as [14], could be used as compile time
            400
                                     Max
                                                                           2
                                                                                                        Standard Deviation                        techniques to remove, in some cases, run-time checks. But unde-
            350
                                                                                                                                                  cidability issues may imply that some, perhaps many, checks may
                                                                                                           Display Based Algorithm
            300                                                          1.5                               Parent Traversal Algorithm             be required at run-time. These techniques could be combined with
            250                                                                                                                                   the algorithms proposed in this paper in order to provide a good
Time (ns)




            200                                                            1                                                                      speedup, and more predictability to RTSJ applications.
            150                                                                                                                                      The concept of RTSJ memory areas, is borrowed from the more
            100                                                          0.5                                                                      general concept of regions which was first introduced by Tofte et
             50                                                                                                                                   al., in [13]. While, the display based approach for constant time
              0
                  0   1      2     4      8       16   32           64
                                                                           0
                                                                               0            1       2       4      8           16   32       64
                                                                                                                                                  type-extension type test was first introduced by Cohen in [12]. The
                                   Distance                                                                 Distance                              main difference between our case and the approach described in
                                                                                                                                                  [12] is that our type hierarchy changes with time, so the type en-
            Figure 7: Performances comparison between Display based vs.                                                                           coding cannot be fixed at compile time.
            Parent traversal algorithm.
                                                                                                                                                  6. CONCLUDING REMARKS
               Figure 7 shows the average, 99%, maximum, and standard de-
            viation for the two algorithms. Figure 8 shows the average check                                                                         We have introduced the concept of parenthood tree, and shown
            time, the difference between the two averages, and the speedup.                                                                       how the memory reference checking problem can be reformulated
               As can be seen from both Figure 7, and Figure 8, the display-                                                                      as a subtype-testing problem on a type hierarchy associated with
            based memory-reference check outperforms the parent-traversal-                                                                        the parenthood tree. We have presented algorithms that reduce the
            based check in each of the test cases. Moreover, as claimed in Sec-                                                                   time necessary to support the RTSJ-mandated checks from linear to
            tion 3.2, the experiments confirm that the checks execute in con-                                                                      constant-time. The algorithms are implemented in jRate which is
                                                                                                                                                  open source and available for experimentation. Our results confirm
            2
              The RDTSC is a 64-bit counter that can be read with the x86 as-                                                                     the predictability of our approach as well as its overall efficiency.
            sembly instruction RDTSC.
            3
              jRate uses a custom encoding for those classes that require fre-                                                                    7. REFERENCES
            quent instanceof tests. This allows instanceof to be re-
            placed by an integer comparison or a bitwise-and operation.                                                                            [1] K. Arnold, J. Gosling, and D. Holmes. The Java
            4
              RTJPerf is currently the only available RTSJ benchmarking suite                                                                          Programming Language. Addison-Wesley, Boston, 2000.
[2] D. F. Bacon, P. Cheng, and V. T. Rajan. A real-time garbage
     collector with low overhead and consistent utilization. In
     Proceedings of the 30th ACM SIGPLAN-SIGACT symposium
     on Principles of programming languages, pages 285–298.
     ACM Press, 2003.
 [3] W. S. Beebee and M. Rinard. An implementation of scoped
     memory for real-time Java. Lecture Notes in Computer
     Science, 2211, 2001.
 [4] Bollella, Gosling, Brosgol, Dibble, Furr, Hardin, and
     Turnbull. The Real-Time Specification for Java.
     Addison-Wesley, 2000.
 [5] P. Cheng and G. Belloch. A parallel, real-time garbage
     collector. ACM SIGPLAN Notices, 36(5):125–136, May
     2001.
 [6] I. Coorporation. Using the RDTSC Instruction for
     Performance Monitoring. Technical report, Intel
     Coorporation, 1997.
 [7] A. Corsaro and D. C. Schmidt. Evaluating Real-Time Java
     Features and Performance for Real-time Embedded Systems.
                                 £
     In Proceedings of the¡ ¢   IEEE Real-Time Technology and
     Applications Symposium, San Jose, Sept. 2002. IEEE.
 [8] A. Corsaro and D. C. Schmidt. The Design and Performance
     of the jRate Real-Time Java Implementation. In
     R. Meersman and Z. Tari, editors, On the Move to
     Meaningful Internet Systems 2002: CoopIS, DOA, and
     ODBASE, pages 900–921, Berlin, 2002. Lecture Notes in
     Computer Science 2519, Springer Verlag.
 [9] GNU is Not Unix. GCJ: The GNU Complier for Java.
     http://gcc.gnu.org/java, 2002.
[10] R. Jones and R. Lins. Garbage Collection Algorithms for
     Automatic Dynamic Memory Management. Wiley  Sons,
     New York, 1996.
[11] M. A. d. M.-C. M. Teresa Higuera-Toledano. Dynamic
     Detection of Access Errors and Illegal References in RTSJ.
                                 £
     In Proceedings of the¡     IEEE Real-Time Technology and
     Applications Symposium, San Jose, Sept. 2002. IEEE.
[12] Norman H. Cohen. Type-Extension Type Tests Can Be
     Performend In Constant Time. ACM Transactions on
     Programming Languages and Systems (TOPLAS), 1991.
[13] M. Tofte and J.-P. Talpin. Region-based memory
     management. Information and Computation,
     132(2):109–176, Feb. 1997.
[14] J. Whaley and M. Rinard. Compositional pointer and escape
     analysis for Java programs. ACM SIGPLAN Notices,
     34(10):187–206, 1999.

More Related Content

Viewers also liked

Mae Designs Portfolio
Mae Designs PortfolioMae Designs Portfolio
Mae Designs PortfolioMae_Designs
 
Finlandia 2009 [Autoguardado]
Finlandia 2009 [Autoguardado]Finlandia 2009 [Autoguardado]
Finlandia 2009 [Autoguardado]guestd4e08
 
Small Business Owners' Work-Life Balance
Small Business Owners' Work-Life BalanceSmall Business Owners' Work-Life Balance
Small Business Owners' Work-Life BalanceInterCall
 
Ei09 Thousands Observers
Ei09 Thousands ObserversEi09 Thousands Observers
Ei09 Thousands Observersnmoroney
 
Visita biblioteca municipal 2013
Visita biblioteca municipal 2013Visita biblioteca municipal 2013
Visita biblioteca municipal 2013XXX XXX
 
Euro Style Design Ltd Arxx P Panel Dura Viessmann Commercialresidential
Euro Style Design Ltd Arxx P Panel Dura Viessmann CommercialresidentialEuro Style Design Ltd Arxx P Panel Dura Viessmann Commercialresidential
Euro Style Design Ltd Arxx P Panel Dura Viessmann CommercialresidentialRoland Laufer
 
Hima, esitys cardiff
Hima, esitys cardiffHima, esitys cardiff
Hima, esitys cardiffAija Hietanen
 
Oral language Primary Delta BJF
Oral language Primary Delta BJFOral language Primary Delta BJF
Oral language Primary Delta BJFFaye Brownlie
 
Ecoescuelas 15 16
Ecoescuelas 15 16Ecoescuelas 15 16
Ecoescuelas 15 16XXX XXX
 
Crosscurrents, 2011, Collaboration Counts!
Crosscurrents, 2011, Collaboration Counts!Crosscurrents, 2011, Collaboration Counts!
Crosscurrents, 2011, Collaboration Counts!Faye Brownlie
 
Ironhack presentation
Ironhack presentationIronhack presentation
Ironhack presentationpristella84
 
B2: The OpenSplice BlendBox
B2: The OpenSplice BlendBoxB2: The OpenSplice BlendBox
B2: The OpenSplice BlendBoxAngelo Corsaro
 
Pleno municipal infantil 2013
Pleno municipal infantil 2013Pleno municipal infantil 2013
Pleno municipal infantil 2013XXX XXX
 
Elaboración jabón 2016
Elaboración jabón 2016Elaboración jabón 2016
Elaboración jabón 2016XXX XXX
 
Innovation mentoring grant proposal 100113 rev 1
Innovation mentoring grant proposal 100113 rev 1Innovation mentoring grant proposal 100113 rev 1
Innovation mentoring grant proposal 100113 rev 1John Michitson
 

Viewers also liked (20)

Mae Designs Portfolio
Mae Designs PortfolioMae Designs Portfolio
Mae Designs Portfolio
 
Finlandia 2009 [Autoguardado]
Finlandia 2009 [Autoguardado]Finlandia 2009 [Autoguardado]
Finlandia 2009 [Autoguardado]
 
Small Business Owners' Work-Life Balance
Small Business Owners' Work-Life BalanceSmall Business Owners' Work-Life Balance
Small Business Owners' Work-Life Balance
 
Ei09 Thousands Observers
Ei09 Thousands ObserversEi09 Thousands Observers
Ei09 Thousands Observers
 
1fevrier
1fevrier1fevrier
1fevrier
 
Visita biblioteca municipal 2013
Visita biblioteca municipal 2013Visita biblioteca municipal 2013
Visita biblioteca municipal 2013
 
Euro Style Design Ltd Arxx P Panel Dura Viessmann Commercialresidential
Euro Style Design Ltd Arxx P Panel Dura Viessmann CommercialresidentialEuro Style Design Ltd Arxx P Panel Dura Viessmann Commercialresidential
Euro Style Design Ltd Arxx P Panel Dura Viessmann Commercialresidential
 
Hima, esitys cardiff
Hima, esitys cardiffHima, esitys cardiff
Hima, esitys cardiff
 
Oral language Primary Delta BJF
Oral language Primary Delta BJFOral language Primary Delta BJF
Oral language Primary Delta BJF
 
Ecoescuelas 15 16
Ecoescuelas 15 16Ecoescuelas 15 16
Ecoescuelas 15 16
 
Crosscurrents, 2011, Collaboration Counts!
Crosscurrents, 2011, Collaboration Counts!Crosscurrents, 2011, Collaboration Counts!
Crosscurrents, 2011, Collaboration Counts!
 
Ironhack presentation
Ironhack presentationIronhack presentation
Ironhack presentation
 
B2: The OpenSplice BlendBox
B2: The OpenSplice BlendBoxB2: The OpenSplice BlendBox
B2: The OpenSplice BlendBox
 
ikp321-02
ikp321-02ikp321-02
ikp321-02
 
Pleno municipal infantil 2013
Pleno municipal infantil 2013Pleno municipal infantil 2013
Pleno municipal infantil 2013
 
coisas boas
coisas boascoisas boas
coisas boas
 
Elaboración jabón 2016
Elaboración jabón 2016Elaboración jabón 2016
Elaboración jabón 2016
 
Innovation mentoring grant proposal 100113 rev 1
Innovation mentoring grant proposal 100113 rev 1Innovation mentoring grant proposal 100113 rev 1
Innovation mentoring grant proposal 100113 rev 1
 
MRLC Feb Reading
MRLC Feb ReadingMRLC Feb Reading
MRLC Feb Reading
 
Naresh
NareshNaresh
Naresh
 

Similar to Efficient Memory-Reference Checks for Real-time Java

Erlang Cache
Erlang CacheErlang Cache
Erlang Cacheice j
 
High level programming of embedded hard real-time devices
High level programming of embedded hard real-time devicesHigh level programming of embedded hard real-time devices
High level programming of embedded hard real-time devicesMr. Chanuwan
 
Developing Safety-Critical Java Applications with oSCJ
Developing Safety-Critical Java Applications with oSCJ Developing Safety-Critical Java Applications with oSCJ
Developing Safety-Critical Java Applications with oSCJ Aleš Plšek
 
Caching principles-solutions
Caching principles-solutionsCaching principles-solutions
Caching principles-solutionspmanvi
 
And Then There Were None
And Then There Were NoneAnd Then There Were None
And Then There Were NoneSimar Neasy
 
Java programing considering performance
Java programing considering performanceJava programing considering performance
Java programing considering performanceRoger Xia
 
Application scenarios in streaming oriented embedded-system design
Application scenarios in streaming oriented embedded-system designApplication scenarios in streaming oriented embedded-system design
Application scenarios in streaming oriented embedded-system designMr. Chanuwan
 
Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)Prashanth Kumar
 
Caching for J2ee Enterprise Applications
Caching for J2ee Enterprise ApplicationsCaching for J2ee Enterprise Applications
Caching for J2ee Enterprise ApplicationsDebajani Mohanty
 
Concurrency Utilities Overview
Concurrency Utilities OverviewConcurrency Utilities Overview
Concurrency Utilities Overviewwhite paper
 
Survey paper _ lakshmi yasaswi kamireddy(651771619)
Survey paper _ lakshmi yasaswi kamireddy(651771619)Survey paper _ lakshmi yasaswi kamireddy(651771619)
Survey paper _ lakshmi yasaswi kamireddy(651771619)Lakshmi Yasaswi Kamireddy
 
Cruiser pldi2011
Cruiser pldi2011Cruiser pldi2011
Cruiser pldi2011nytshade15
 
Efficient Management for Hybrid Memory in Managed Language Runtime
Efficient Management for Hybrid Memory in Managed Language RuntimeEfficient Management for Hybrid Memory in Managed Language Runtime
Efficient Management for Hybrid Memory in Managed Language RuntimeChenxi Wang
 
Ch 2 Names scopes and bindings.pptx
Ch 2 Names scopes and bindings.pptxCh 2 Names scopes and bindings.pptx
Ch 2 Names scopes and bindings.pptxRanjanaShevkar
 

Similar to Efficient Memory-Reference Checks for Real-time Java (20)

Erlang Cache
Erlang CacheErlang Cache
Erlang Cache
 
High level programming of embedded hard real-time devices
High level programming of embedded hard real-time devicesHigh level programming of embedded hard real-time devices
High level programming of embedded hard real-time devices
 
Developing Safety-Critical Java Applications with oSCJ
Developing Safety-Critical Java Applications with oSCJ Developing Safety-Critical Java Applications with oSCJ
Developing Safety-Critical Java Applications with oSCJ
 
Caching principles-solutions
Caching principles-solutionsCaching principles-solutions
Caching principles-solutions
 
Os
OsOs
Os
 
And Then There Were None
And Then There Were NoneAnd Then There Were None
And Then There Were None
 
Java programing considering performance
Java programing considering performanceJava programing considering performance
Java programing considering performance
 
Application scenarios in streaming oriented embedded-system design
Application scenarios in streaming oriented embedded-system designApplication scenarios in streaming oriented embedded-system design
Application scenarios in streaming oriented embedded-system design
 
Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)Memory Management in the Java Virtual Machine(Garbage collection)
Memory Management in the Java Virtual Machine(Garbage collection)
 
Gfs论文
Gfs论文Gfs论文
Gfs论文
 
The google file system
The google file systemThe google file system
The google file system
 
Caching for J2ee Enterprise Applications
Caching for J2ee Enterprise ApplicationsCaching for J2ee Enterprise Applications
Caching for J2ee Enterprise Applications
 
RTOS Basic Concepts
RTOS Basic ConceptsRTOS Basic Concepts
RTOS Basic Concepts
 
Concurrency Utilities Overview
Concurrency Utilities OverviewConcurrency Utilities Overview
Concurrency Utilities Overview
 
Survey paper _ lakshmi yasaswi kamireddy(651771619)
Survey paper _ lakshmi yasaswi kamireddy(651771619)Survey paper _ lakshmi yasaswi kamireddy(651771619)
Survey paper _ lakshmi yasaswi kamireddy(651771619)
 
Cruiser pldi2011
Cruiser pldi2011Cruiser pldi2011
Cruiser pldi2011
 
gfs-sosp2003
gfs-sosp2003gfs-sosp2003
gfs-sosp2003
 
gfs-sosp2003
gfs-sosp2003gfs-sosp2003
gfs-sosp2003
 
Efficient Management for Hybrid Memory in Managed Language Runtime
Efficient Management for Hybrid Memory in Managed Language RuntimeEfficient Management for Hybrid Memory in Managed Language Runtime
Efficient Management for Hybrid Memory in Managed Language Runtime
 
Ch 2 Names scopes and bindings.pptx
Ch 2 Names scopes and bindings.pptxCh 2 Names scopes and bindings.pptx
Ch 2 Names scopes and bindings.pptx
 

More from Angelo Corsaro

zenoh: The Edge Data Fabric
zenoh: The Edge Data Fabriczenoh: The Edge Data Fabric
zenoh: The Edge Data FabricAngelo Corsaro
 
Data Decentralisation: Efficiency, Privacy and Fair Monetisation
Data Decentralisation: Efficiency, Privacy and Fair MonetisationData Decentralisation: Efficiency, Privacy and Fair Monetisation
Data Decentralisation: Efficiency, Privacy and Fair MonetisationAngelo Corsaro
 
zenoh: zero overhead pub/sub store/query compute
zenoh: zero overhead pub/sub store/query computezenoh: zero overhead pub/sub store/query compute
zenoh: zero overhead pub/sub store/query computeAngelo Corsaro
 
zenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolzenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolAngelo Corsaro
 
zenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolzenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolAngelo Corsaro
 
Breaking the Edge -- A Journey Through Cloud, Edge and Fog Computing
Breaking the Edge -- A Journey Through Cloud, Edge and Fog ComputingBreaking the Edge -- A Journey Through Cloud, Edge and Fog Computing
Breaking the Edge -- A Journey Through Cloud, Edge and Fog ComputingAngelo Corsaro
 
fog05: The Fog Computing Infrastructure
fog05: The Fog Computing Infrastructurefog05: The Fog Computing Infrastructure
fog05: The Fog Computing InfrastructureAngelo Corsaro
 
Cyclone DDS: Sharing Data in the IoT Age
Cyclone DDS: Sharing Data in the IoT AgeCyclone DDS: Sharing Data in the IoT Age
Cyclone DDS: Sharing Data in the IoT AgeAngelo Corsaro
 
fog05: The Fog Computing Platform
fog05: The Fog Computing Platformfog05: The Fog Computing Platform
fog05: The Fog Computing PlatformAngelo Corsaro
 
Programming in Scala - Lecture Four
Programming in Scala - Lecture FourProgramming in Scala - Lecture Four
Programming in Scala - Lecture FourAngelo Corsaro
 
Programming in Scala - Lecture Three
Programming in Scala - Lecture ThreeProgramming in Scala - Lecture Three
Programming in Scala - Lecture ThreeAngelo Corsaro
 
Programming in Scala - Lecture Two
Programming in Scala - Lecture TwoProgramming in Scala - Lecture Two
Programming in Scala - Lecture TwoAngelo Corsaro
 
Programming in Scala - Lecture One
Programming in Scala - Lecture OneProgramming in Scala - Lecture One
Programming in Scala - Lecture OneAngelo Corsaro
 
Data Sharing in Extremely Resource Constrained Envionrments
Data Sharing in Extremely Resource Constrained EnvionrmentsData Sharing in Extremely Resource Constrained Envionrments
Data Sharing in Extremely Resource Constrained EnvionrmentsAngelo Corsaro
 
The DDS Security Standard
The DDS Security StandardThe DDS Security Standard
The DDS Security StandardAngelo Corsaro
 
The Data Distribution Service
The Data Distribution ServiceThe Data Distribution Service
The Data Distribution ServiceAngelo Corsaro
 
RUSTing -- Partially Ordered Rust Programming Ruminations
RUSTing -- Partially Ordered Rust Programming RuminationsRUSTing -- Partially Ordered Rust Programming Ruminations
RUSTing -- Partially Ordered Rust Programming RuminationsAngelo Corsaro
 

More from Angelo Corsaro (20)

Zenoh: The Genesis
Zenoh: The GenesisZenoh: The Genesis
Zenoh: The Genesis
 
zenoh: The Edge Data Fabric
zenoh: The Edge Data Fabriczenoh: The Edge Data Fabric
zenoh: The Edge Data Fabric
 
Zenoh Tutorial
Zenoh TutorialZenoh Tutorial
Zenoh Tutorial
 
Data Decentralisation: Efficiency, Privacy and Fair Monetisation
Data Decentralisation: Efficiency, Privacy and Fair MonetisationData Decentralisation: Efficiency, Privacy and Fair Monetisation
Data Decentralisation: Efficiency, Privacy and Fair Monetisation
 
zenoh: zero overhead pub/sub store/query compute
zenoh: zero overhead pub/sub store/query computezenoh: zero overhead pub/sub store/query compute
zenoh: zero overhead pub/sub store/query compute
 
zenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolzenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocol
 
zenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocolzenoh -- the ZEro Network OverHead protocol
zenoh -- the ZEro Network OverHead protocol
 
Breaking the Edge -- A Journey Through Cloud, Edge and Fog Computing
Breaking the Edge -- A Journey Through Cloud, Edge and Fog ComputingBreaking the Edge -- A Journey Through Cloud, Edge and Fog Computing
Breaking the Edge -- A Journey Through Cloud, Edge and Fog Computing
 
Eastern Sicily
Eastern SicilyEastern Sicily
Eastern Sicily
 
fog05: The Fog Computing Infrastructure
fog05: The Fog Computing Infrastructurefog05: The Fog Computing Infrastructure
fog05: The Fog Computing Infrastructure
 
Cyclone DDS: Sharing Data in the IoT Age
Cyclone DDS: Sharing Data in the IoT AgeCyclone DDS: Sharing Data in the IoT Age
Cyclone DDS: Sharing Data in the IoT Age
 
fog05: The Fog Computing Platform
fog05: The Fog Computing Platformfog05: The Fog Computing Platform
fog05: The Fog Computing Platform
 
Programming in Scala - Lecture Four
Programming in Scala - Lecture FourProgramming in Scala - Lecture Four
Programming in Scala - Lecture Four
 
Programming in Scala - Lecture Three
Programming in Scala - Lecture ThreeProgramming in Scala - Lecture Three
Programming in Scala - Lecture Three
 
Programming in Scala - Lecture Two
Programming in Scala - Lecture TwoProgramming in Scala - Lecture Two
Programming in Scala - Lecture Two
 
Programming in Scala - Lecture One
Programming in Scala - Lecture OneProgramming in Scala - Lecture One
Programming in Scala - Lecture One
 
Data Sharing in Extremely Resource Constrained Envionrments
Data Sharing in Extremely Resource Constrained EnvionrmentsData Sharing in Extremely Resource Constrained Envionrments
Data Sharing in Extremely Resource Constrained Envionrments
 
The DDS Security Standard
The DDS Security StandardThe DDS Security Standard
The DDS Security Standard
 
The Data Distribution Service
The Data Distribution ServiceThe Data Distribution Service
The Data Distribution Service
 
RUSTing -- Partially Ordered Rust Programming Ruminations
RUSTing -- Partially Ordered Rust Programming RuminationsRUSTing -- Partially Ordered Rust Programming Ruminations
RUSTing -- Partially Ordered Rust Programming Ruminations
 

Recently uploaded

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 

Recently uploaded (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 

Efficient Memory-Reference Checks for Real-time Java

  • 1.   Efficient Memory-Reference Checks for Real-time Java Angelo Corsaro and Ron K. Cytron Department of Computer Science and Engineering Washington University St. Louis, MO, 63130, USA ¡ corsaro, cytron @cse.wustl.edu¢ ABSTRACT 1. INTRODUCTION The scoped-memory feature is central to the Real-Time Specifica- One of the main hurdles for making Java ¤ ¥£ [1] usable for the tion for Java. It allows greater control over memory management, development of real-time systems has been the fact it is a garbage- in particular the deallocation of objects without the use of a garbage collected language. While developers generally like the functional- collector. To preserve the safety of storage references associated ity provided by garbage collection, they object to those aspects of with Java ¤ ¥£ since its inception, the use of scoped memory is con- garbage collection that could introduce unpredictable delay into an strained by a set of rules in the specification. While a program’s application. adherence to the rules can be partially checked at compile-time, un- At one extreme, some collectors work in a stop the world and decidability issues imply that some—perhaps, many—checks may collect fashion, in which the garbage collector has to stop all the be required at run-time. Poor implementations of those run-time running threads before attempting to reclaim dead storage. Other checks could adversely affect overall performance and predictabil- types of garbage collectors take a less restrictive approach, but most ity, the latter being a founding principle of the specification. of the precise garbage collectors known in literature [10] are not In this paper we present efficient algorithms for managing scoped suitable for real-time systems. memories and the checks they impose on programs. Implementa- Recently, garbage-collection algorithms have been described that tions and results published to date require time linear in the depth reasonably bound the delay experienced by an application [5, 2]. of scope nesting; our algorithms operate in constant time. We de- However, those algorithms require an extra processor, extra heap scribe our approach and present experiments quantifying the gains space, or both—luxuries that may not be available on a cost com- in efficiency. petitive, embedded, real-time system. Thus, the expert group that designed the Real-Time Specification for Java (RTSJ) [4] decided Categories and Subject Descriptors to provide a memory management scheme that would allow pro- grammers to circumvent the garbage collector, giving them control D.3.3 [Programming Languages]: Language Construct and Fea- over the time at which memory is allocated and reclaimed, while at tures—dynamic storage management, constraints; D.2.8 [Software the same time retaining the storage-referencing safety properties of Engineering]: Metrics—complexity measures, performance mea- a garbage-collected language. sures A programming language with safe storage references denies ac- cess to storage that is dead or that has been reallocated for other General Terms purposes. Languages like C++ allow explicit control of object allo- cation and deallocation, yet they provide no mechanism for check- Algorithms, Performance, Design ing safe storage references. If RTSJ had adopted the approach of C++, then unsafe storage references would go unchecked, violating Keywords a principle design force for Java ¤ ¥£. Real-Time Java, Object Oriented Languages, Scoped Memory, Garbage The RTSJ, as described in Section 2, extends the Java memory Collection, Memory Management model by providing several kinds of memory areas other than the traditional, garbage-collected heap. These memory areas have dif- ferent properties in term of the lifetime of objects allocated within them, and in term of the timing guarantees for object allocation and deallocation.   In particular, the scoped memory area provides a heap-like area Sponsored by DARPA under contract F33615-00-C-1697 for object allocation. However, garbage collection does not deter- mine when objects in a scoped memory area are dead. Instead, the entire scope can be collected when all threads that have entered the area (by invoking a particular method on the area) have apparently Permission to make digital or hard copies of all or part of this work for abandoned the area (by exiting the method invoked to gain entry). personal or classroom use is granted without fee provided that copies are Unfortunately, a thread that has left a scoped memory area could not made or distributed for profit or commercial advantage and that copies yet possess references into that area. Threads could also develop bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific references to scoped memory areas for which they have never for- permission and/or a fee. mally declared their intention to use. LCTES’03, June 11–13, 2003, San Diego, California, USA. Thus, the undisciplined use of the RTSJ could lead to dangling Copyright 2003 ACM 1-58113-647-1/03/0006 ...$5.00.
  • 2. references that would never occur in standard Java . To avoid ¤ ¥£ For JVM and application developers alike, scoped memory is this problem, the RTSJ comes with a a set of rules that must be one of the more interesting features added to Java ¤by the RTSJ. ¥£ enforced—at runtime if necessary—by every compliant Java Vir- Object allocated within a scoped memory are not garbage collected; tual Machine (JVM). These rules substitute a runtime exception in instead, a reference-counting mechanism detects when all objects place of an unsafe reference. in a scope should be collected. Safety of scoped memory areas is To summarize, scoped memory areas are a compromise for Java ¤ ¥£ ensured by reliance upon (1) a set of rules imposed on entrance of and real-time developers, offering some control over storage deal- scoped memories, and (2) a set of rules that govern the legality of location while ensuring that unsafe references are checked and re- reference between objects allocated in different memory areas. The ported as such. At issue is the expense of implementing the checks remainder of this section concerns memory areas and will provide necessary for compliance with the RTSJ. an explanation of its mechanics. This paper focuses on the data structure and the algorithms used to implement the RTSJ memory model and to enforce the safety 2.1 Understanding the Scoped Memory Model rules. The main contribution of this paper is that of showing how To understand the mechanics of scoped memory areas, it is im- all the necessary runtime checks can be performed in constant time, portant to understand the RTSJ rules that govern access to those ar- by either using more efficient data structures than those proposed eas. RTSJ assumes that Java ¤ £has its traditional threads, but adds by the RTSJ or by using analogies with problems that arise in type two new real-time thread types: RealtimeThread and NoHeap- inclusion testing [12]. RealtimeThread, with access rules as follows: The remainder of the paper is organized as follows, Section 2 contains an in depth description of the RTSJ memory model and of 1. A traditional thread can allocate memory only on the tradi- the implementation techniques currently used; Section 3 presents tional heap. our improvements, showing how the RTSJ memory model can be implemented efficiently by using better data structures and algo- 2. Real-time threads may allocate memory from a memory area rithms; Section 4 presents the results of performance analysis that other than the heap by making that area the current allocation compares the performances of the algorithms proposed in this paper context. with those suggested by the RTSJ and used in literature. Section 5 3. A new allocation context, or scope, is entered by calling the provides an outline of the state of the art and related work; finally MemoryArea.enter() method or by starting a real-time Section 6 contains our concluding remarks. thread whose constructor was given a reference to an instance of MemoryArea. Once a scope is entered, all subsequent 2. THE RTSJ MEMORY SUBSYSTEM uses of the new keyword, within the program logic, will al- The RTSJ extends the Java memory model by providing mem- locate the memory from the current scope. When the scope ory areas other than the heap. As shown in Figure 1, these memory is exited by returning from the enter() method, all subse- areas are characterized by the anticipated lifetime of the contained quent uses of the new operation will allocate memory from objects (immortal, scoped) as well as the time taken for allocation the memory area associated with the enclosing scope. (linear, variable). Objects allocated within the (singleton) Immortal 4. A real-time thread is associated with a scope stack containing MemoryArea all the memory areas that the thread has entered but not yet exited. On the other hand, the rules that govern the scoped memory be- ImmortalMemory ScopedMemory ImmortalPhysicalMemory HeapMemory havior are the following: 1. Each instance of the class ScopedMemory must maintain VTMemory LTMemory LTPhysicalMemory VTPhysicalMemory a reference count of the number of threads active in that in- stance. Figure 1: Hierarchy of Classes in the RTSJ Memory Model 2. When the reference count for an instance of the class Scoped- Memory have the same lifetime as the application: they are never Memory is decremented from one to zero, all objects within collected. Each Scoped memory area is equipped with a reference that area are considered unreachable and are candidates for count of the number of threads active in its area. The lifetime of reclamation. The finalizers for each object in the memory as- objects allocated in such an area is keyed to the reference count. sociated with an instance of ScopedMemory are executed Figure 1 includes the LTPhysicalMemory and VTPhysical- to completion before any statement in any thread attempts to Memory areas, which afford raw access to specific locations in an access the memory area again. address space. We mention the physical memory areas for com- 3. Each ScopedMemory has at most one parent, defined as pleteness; it is their scoped nature that is relevant to the work pre- follows. For a ScopedMemory that has been pushed on a sented in this paper. scope stack, i.e., entered by at least one thread, its parent is Additionally, scoped memory areas provide bounds on the allo- the first instance of ScopedMemory below it on the scope cation time; currently, variable (VTMemory) and linear-time (LT- stack, if there is one; otherwise, its parent is the primordial Memory) allocators are accommodated. For linear allocation time, scope. For as scope not pushed on the scope stack, its parent the RTSJ requires that the time needed to allocate the bytes¤¢  £ ¡ is null. to hold the class instance must be bounded by a polynomial func- tion ¨ §¥   © ¦ for some constant £ ¡ .1 Figure 2 depicts three scoped memory areas, , , and , and 1 ! two real-time thread , and . In Figure 2, ! enters , , and This bound does not include the time taken by an object’s con- structor or a class’s static initializers. then tries to enter , while # enters , , and then tries to enter
  • 3. . In Figure 2, circles represents scoped memories while arrows Algorithm 1: checkSingleParentRule point from a child scope to its parent scope. Input: § ©§¥£ ¤ ¢¨ ¦¤ ma, '%$#!¤ ¨ scopeStack If , as shown in Figure 2, tries to enter after has entered # Output: boolean isSingleParentRuleOK it, than a compliant RTSJ JVM will detect a violation of the single begin parent rule and throw an exception. This violation, as visible in Figure 2 by the contents of the scope stack of and , can be ! # isSingleParentRuleOK true; ( detected by a JVM inspecting the scope stack and checking that no if ma instanceOf !©§1%0¤ ¨ ¢¨ ¦¤ £) then single-parent rule violation happens. 2 parent findFirstScope scopeStack); ¦ Why is this single-parent rule necessary? The single parent rule 2 if ma.parent nil or ma.parent parent then 2 guarantees that once a thread has entered a set of scoped memory ma.parent parent ; ( scopeStack.push ma ; ¦ © in a given order, any other thread will have to enter them in the same order, up to the point at which the reference count for all ( ma.refCount ma.refCount 1; 3 these memory drops to zero. At that point, a new nesting will be else possible. This requirement guarantees that a parent scope will have isSingleParentRuleOK false ; ( a lifetime that is at least that of any of its child scopes, making it safe for objects in a descendant scope to reference objects in an end ancestor scope. Algorithm 2: findFirstScope A T1 A T2 A A Input: '%$#!¤ ¨ scopeStack B 1 A A 2 A 3 B T1 C T2 Output: !7§¥%§65'4 ¢¨ ¦¤ £)¤ ¨ firstScope T2 T1 C C A begin C A A B B C B B C firstScope ( PrimordialScope ; A C A B A for ( 48 scopeStack.size() downto @ A9 £ do DC8 B if scopeStack instanceOf !©§1%§6¨4 ¢¨ ¦¤ £)¤ then Figure 2: The scope stack and the single parent rule. ( firstScope scopeStack ; DC8 B break ; Figure 3 extends the example of Figure 2, showing a potential scope tree of an RTSJ application; all nodes of that tree represent end scoped memory areas. An object in node of such a tree can ref- ¡ ¢ erence an object in node only if is an ancestor of . Thus, ¢ ¡ the curved arrows in Figure 3 show some (not all) legal references, while the zig-zag arrows represent some (not all) illegal references. 2.2 RTSJ Suggested Runtime Check Imple- With the single-parent rule, the ancestor relationship described mentation above guarantees that legal accesses occur only from a scope to We next present the current state of algorithms for scope and ref- another at least as long-lived as the former. In other words, no legal erence checks, as suggested by the RTSJ and its current implemen- references are “dangling.” tations [11, 3]. we provide examples that explain why this approach To enforce the rules, a compliant JVM has to check every attempt is not satisfactory for real-time applications. to enter a memory area by a thread, to ensure that the single parent rule is not violated, and it has also to check the creation of reference 2.2.1 Data Structures between objects belonging to different memory areas. Since object The RTSJ assumes that (1) there is a scope stack associated (at references occur frequently in Java programs, it is important to ¤ ¥£ least logically) with each real-time thread, (2) each memory area implement them efficiently and predictably. keeps a reference to its parent, (3) scoped memories keep track of their reference count, and (4) for any object, it is possible to obtain A a reference to the memory area that contains it. The algorithms used to enforce the single-parent rule and the assignment rules are based on these data structures. B F 2.2.2 Single Parent Rule The single parent rule is enforced at the point a real-time thread E E tries to enter a scope . At that time, if has no parent, then entry is E G allowed. Otherwise, the thread entering must have entered every E C E proper ancestor of in the scope tree. Algorithm 1 and Algorithm 2 contain the pseudocode that performs this test. Examination of these algorithms reveals a time complexity of D H © ¨ ¦ F   where represents the depth of the stack. 2.2.3 Memory Reference Checks The rules that govern the validity of references across memory Figure 3: Scope Tree and Scoped Memory Reference Checking areas can be summarized as follows: Sample. 1. A reference to an object allocated in a ScopedMemory can never be stored in an object allocated in the Java heap or in the immortal memory.
  • 4. Algorithm 3: checkReferenceValidity Algorithm 5: checkReferenceValidity2 Input: 0! !7§¥£ ¤ ¢¨ ¦¤ from, to, §! !701£ ¤ ¢¨ ¦¤ Input: § ©§¥£ ¤ ¢¨ ¦¤ from, § !©§1£ ¤ ¢¨ ¦¤ to $465'4 ¤ ¨scopeStack Output: boolean validReference Output: boolean validReference begin begin validReference true; ¡2 ( validReference true; ¡2 ( if from to then if from to then if to instanceOf !7§¥%§65'4 ¢¨ ¦¤ £)¤ ¨ then if to instanceOf then !©§1%§6¨4 ¢¨ ¦¤ £)¤ ¢¨©§¤¥%§65'4 ¦ £)¤ ¨ if from instanceOf then if from instanceOf !701%§65'4 ¢¨ ¦¤ £)¤ ¨ then ancestor ¡2 (¡ from.getParent(); toDepth depth to, scopeStack ;© ¦ 2 2 while to ancestor and ancestor nil do if toDepth then §¥¤£2 ¦¢ ancestor ( ancestor.getParent(); ¡2 validReference false; ( if to ancestor then else ( validReference false; fromDepth depth from, scopeS- ¦ 2 else tack ; © deltaDepth toDepth fromDepth ; 9 2 validReference ( false; if not deltaDepth © ¦§¤¨ then ¢ ¨ © ¦£ validReference false; ( end else validReference ( false; time applications inevitably contain code fragments whose exe- cution time must be statically known. The scope stacks for an end application—in particular, their depth—are not necessarily decid- able at compile-time. Thus, linear-time algorithms for checking the single-parent rule and the memory references may incur unpre- Algorithm 4: depth dictable overhead. As a result, the application must either overpro- Input: 0! !7§¥£ ¤ ¢¨ ¦¤ ma, scopeStack #65'4 ¤ ¨ vision, thus wasting resources, or else underprovision, and perhaps Output: int depth miss a critical deadline. begin Moreover, the time spent checking a given memory reference depth ;¤( ¦¢ using the above algorithms will vary depending on the particular ( index scopeStack.size() - 1; scope stack in place when the check is performed. Even a simple while index and scopeStack index £ ¡ ma do B ¡2 C store instruction will thus take varying amounts of time depending index index ;( @ A9 on the scope stack. This in prevents analysis of the code’s timing in any particular context, but makes it necessary to analyze its timing if scopeStack index ma then B 2C in all the different contexts in which it could be executed. In our ex- ( depth scopeStack.size() index 9 @ A9 ; perience in developing an Object Request Broker (ORB) for RTSJ, end such unpredictability makes it impossible to bound reasonably the time for servicing clients’ requests. 2. A reference to an object allocated in a ScopedMemory ¦ 3. OPTIMIZING THE RTSJ MEMORY SUB- can only be stored in objects allocated in a ScopedMemory only if is a descendant of ; note that the case is ¦ ¦ 2 SYSTEM thus allowed. We have thus far described the checks required by a compliant RTSJ implementation, and we have explained why the algorithms The RTSJ specification does not explicitly provide an algorithm for currently present in literature [4, 3, 11] are not ideal for real-time checking the legality of a memory reference, but two approaches applications. We next show how to extend the data structures used could potentially be taken. In one approach [11, 3], essentially fol- by the RTSJ to perform all required checks in constant time. Our lowing the advice given in the RTSJ specification, a thread’s scope approach is inspired and based upon type-inclusion tests for single- stack can be scanned to ensure that the memory area from which inheritance, object-oriented languages [12]. we are creating a reference was pushed later than the memory area We have implemented the algorithms described here in the jRate of the reference’s target. This approach is described by the Algo- [8] memory subsystem; for convenience, we describe our approach rithm 3 and Algorithm 4. By inspection of the pseudocode, this in the context of jRate. check has time complexity © §¨ ¦ F where is the depth of the scope   3.1 Optimizing the Singe Parent Rule Check stack. We present a slightly more efficient variation in Algorithm 5. jRate’s scope-stack implementation uses data structures that al- This algorithm, based on the observation that reference from scoped low all scope stack operations to be performed in constant time. memory to heap or immortal memory are always legal, and the op- As shown in Figure 4, jRate augments the scope-stack data struc- posite is always illegal, avoids scanning the scope stack, and simply ture suggested by RTSJ, linking those slots that represent scoped follows a scope’s parent link to discover if the target reference is in memory areas. An index is also maintained to the topmost scoped an ancestor scope of the source. memory, so that the next scoped memory area pushed onto the stack It is well known that for real-time applications, it is important to can be linked with the others. be able to put bounds on the execution of operations within some This design allows a constant-time implementation of '' 8 )   8 ¥ 9E piece of code, and for code within a whole application. Real- ¦© 65'4 ¤ ¨ , while at the same time maintaining constant-time bounds
  • 5. Top H Scoped Memory Top A H F Bottom B I I Scoped Memory Non-Scoped Memory H E G H Figure 4: The jRate Scope Stack structure. Algorithm 6: findFirstScope Input: ss $465'4 ¤ ¨ C I L Output: !©§1%§6¨4 ¢¨ ¦¤ £)¤ firstScope begin firstScope ¤65'4D¡ 8 !©¦ ( ¨   ) ¨¡ 8 ; I §¨¥¦¤ ¢£§12 if ss.lastSMIndex then C firstScope B ( ss ss.lastSMIndex .ma ; end D for© §E ¦ © and . ¦© 5¨ Figure 5: A sample Scope Tree structure (Grey nodes represent Algorithm 6 provides the pseudocode for the constant-time im- plementation of ¦© ¤65'4 ' 8 )   8 ¥ ¨ E , while Algorithm 7 and Al- the Heap(H), and Immortal (I) Memory). gorithm 8 provide the pseudocode for the and E © 5¨ opera- tions. On inspection it can be seen that all of these operation are performed in constant time. As compared with the RTSJ-inspired implementations, no scanning of the scope stack is required. The actions required for processing memory areas require know- depth = 0 ing what kind of memory area is at-hand (immortal, scoped, etc). A While such information could be determined by Java ’s in- ¤ £ A stanceof test, that test may require time linear in the depth of the program’s class hierarchy. Instead, jRate] optimizes such tests by tagging memory area objects to allow a constant-time test. depth = 1 This enhancement of the scope stack structure makes it possi- B F ble to know exactly which entries of the scope stack are scoped A B A F memories and which are not. This knowledge enables it to elide a test on the type of memory area, and avoids blindly searching for scoped memories on the stack to decrement the reference count when destroying the scope stack. As a final note, the size of a jRate depth = 2 C E G real-time thread’s scope stack can be fixed at thread-creation time. This design makes jRate more space efficient by avoiding the use A B C A B E A F G of pointers to implement the linked list. 3.2 Optimizing the Memory Area Reference depth = 3 Check D L A F G L To understand the main idea behind our technique for imple- A B C D menting the reference checks in constant time, consider a generic scope stack tree, such as the one in Figure 5. In this example, some of the memory areas are scoped and some are not. The scope stack Figure 6: Transformed and Decorated Scope Tree structure. of any running real-time thread can be represented as a path from the root down to some interior or leaf note. As stated in Sec-
  • 6. Algorithm 7: Push This avoids the need to map a storage area to a unique number and Input: #65'4 0! !7§¥£ ma, ¤ ¨ ss ¤ ¢¨ ¦¤ improves the efficiency of our algorithms. begin For example, if we consider the scoped memory in Figure 6, if ma instanceOf ©§¥%§65'4 ¢¨ ¦¤ £)¤ ¨ then its depth will be and its display will be © ¦ . Notice that ¡ ¡ if ma.getParent() then 8   2 the depth is the same as the display length minus one, so an imple- ma.setParent(findFirstScope(ss )); mentation won’t necessarily need to store this information twice. Here we treat them separately only to simplify exposition of our else ¡2 algorithms. Algorithm 9 contains the pseudocode that shows how, if ma.getParent() findFirstScope(ss ) with these extensions, it is possible to perform the memory refer- then ence check in constant time. In this algorithm it is assumed that   8¨ ' ¡ ¤ ¤   ¢ §65'4 ¤ throw )¤ ¨ ; both the heap and the immortal memory have a depth of . @ A9 ss.top ss.top ; @3 ( ss ss.top .ma ma ; ( C B Algorithm 9: checkReferenceValidity ss ss.top .prevSM ( ss.lastSMIndex ; C B Input: § ©§¥£ ¤ ¢¨ ¦¤ from, § !©§1£ ¤ ¢¨ ¦¤ to ss.lastSMIndex ss.top ; ( Output: boolean validReference else begin ss.top ss.top ; @3 ( validReference false;( ss ss.top .ma ma ; ( C B if from.depth to.depth then ¢ end if to.depth @ A9 2 then validReference true; ( Algorithm 8: Pop else Input: ss $465'4 ¤ ¨ B if from.display to.depth to then2C begin validReference true; ( ¢¨©§¤¥%)§65'4 ¦ £ ¤ ¨ if ss ss.top .ma instanceOf C B then end B ss.lastSMIndex ( ScopedMemory ss.top .prevSM ; C ss.top ss.top ; @ A9 ( Finally, we note that the management of displays does not add considerable complexity when entering or exiting a memory area. end When a scoped memory is entered for the first time, or after its reference count has dropped to zero, setting up the display simply requires copying the parent’s display and adding itself at the end. tion 2.2.3, references can always be made from objects in a scoped The only operation required when the last thread leaves the scoped memory to object in the heap or immortal memory; the opposite is memory is to invalidate the display. never allowed. Also, the ancestor relation among scope memory In summary we have described a constant-time algorithm that of- areas is defined by the nesting of the areas themselves; interven- fers far greater predictability and asymptotic efficiency over the ap- ing entry into the heap or immortal memory areas do not affect proach currently implemented for RTSJ. We next explore the prac- the scopes. We call the tree implied by the scoped memory areas’ tical efficiency of our approach. ancestor relation the parenthood tree. For instance, collapsing all the nodes that represent either the heap or immortal memory in the scope tree of Figure 5, we obtain the tree depicted in Figure 6. In 4. PERFORMANCE EVALUATION this tree, a direct edge from node to node , means that is the We next present the results of a performance comparison be- parent of . tween the memory-reference checking scheme proposed in this pa- The advantage of this formulation is that subtype-testing algo- per and the one proposed by the RTSJ. Below we describe the rithms [12] can be applied to the parenthood tree to determine legal testbed, the tests performed, and the results obtained. references. Relying on this observation, we can use a technique based on displays, similar to that proposed by Cohen [12], to determine the 4.1 Testbed validity of a memory reference in constant time. The parenthood The platform used for running the test was a Pentium III, 733 MHz tree can change with time, since the scopes’ parent-child relation processor with 256 MB of RAM, running Linux RedHad 8.0 with changes as the application runs and scoped memory areas are en- the kernel v2.4.18–24.8.0. The latest version of jRate, which is tered and exited. Thus, the associated type hierarchy is not fixed, available at http://tao.doc.wustl.edu/˜corsaro/jRate but changes at well-defined points—when the reference count of a was used in the performed test. jRate [8] is an open-source RTSJ- scoped memory goes from zero to one or from one to zero. At such based real-time Java implementation currently under development points, the typing information associated with a scoped memory at Washington University. jRate extends the open-source GNU has to be created and destroyed, respectively. Compiler for Java (GCJ) runtime system [9] to provide an ahead- To facilitate a constant-time memory-reference check, we aug- of-time compiled middleware platform for developing RTSJ-compliant ment the information associated with a scoped memory to include applications. its depth in the parenthood tree and a display that contains the type identification codes of its ancestors in the parenthood tree. 4.2 Timing Measurements The address of a scoped area serves nicely as a unique type iden- An issue that arises when conducting benchmarks concerns the tifier, thanks to the single-parent rule: once a scoped memory area timing mechanism that provides the results. To ensure precise mea- is reclaimed, no memory area can store its address in its display. surements we used our own native timers, which, on all Pentium-
  • 7. based systems, rely on the read-time stamp counter RDTSC 2 in- Display Parent Traversal Delta Speedup 0 48.460 ns 70.830 ns 22.370 ns 1.461 struction [6] to obtain timing resolution in terms of the CPU clock 1 57.011 ns 71.270 ns 14.259 ns 1.250 period. 2 57.011 ns 78.394 ns 21.382 ns 1.375 4 57.011 ns 86.948 ns 29.937 ns 1.525 4.3 Test Description and Results 8 57.011 ns 121.149 ns 64.138 ns 2.125 To compare the performance of our approach against that of 16 57.011 ns 155.366 ns 98.355 ns 2.725 other systems based on the RTSJ, we implemented both algorithms 32 57.017 ns 222.351 ns 165.334 ns 3.899 in jRate. Other RTSJ systems to-date follow Algorithm 3—scanning 64 57.011 ns 359.178 ns 302.166 ns 6.300 the scope stack to determine the validity of a reference check. But, if the tests can be carried out in constant time3 , then ¥ §'   $ E   8 ¨¤ Figure 8: Average reference check time. Algorithm 5 is more efficient since there is no need to scan the stant time, regardless of the depth of the scope stack. The display scope stack. Instead, the scope hierarchy is consulted. We there- based algorithm, not only provides average constant time checks, fore implemented and compared the better Algorithm 5 with our but its worst case performance indexes, i.e., 99% and max, are very display-based approach as described by Algorithm 9. closely bound—practically identical—to the average. Both algorithms are implemented in C++, on the native side of Note that the results provided by this test also predict the timing jRate. To better estimate the performance of the two algorithms, behavior of these algorithms for invalid memory references. For and to avoid the overhead and interference of Cygnus Native In- the display-based approach, the time taken to detect a valid or an terface (CNI), we instrumented the native code directly to measure invalid reference is the same, and does not depend on the structure times for both approaches. of the parenthood tree. On the other hand, if we consider the parent- In order to compare the efficiency of the different memory ref- traversal algorithm, the time necessary for detecting an invalid ref- erence algorithms, we extended the RTJPerf4 [7] benchmarking erence (in the case of two scoped memories) requires traversing suite, with a test that creates a reference from a scoped memory the parents path to the root. Thus, results shown in Figure 7, and to a scoped memory ; where is the ancestor of , i.e., an   Figure 8 essentially determine the time taken to check an invalid   ancestor that has a distance of from . The values of consid-   reference when the ! ¥ ¦¨   scoped memory has a distance of from ered were 0, 1, 2, 4, 8, 16, 32, and 64. The time for performing the the root of the parenthood tree. reference check was computed as the average of 2000 samples. 400 Average 400 99% 5. RELATED WORK 350 350 Most of the work available in literature, which addresses the im- 300 300 plementation of the RTSJ memory subsystem, such as [11], and 250 250 [3], use the same algorithms proposed by the RTSJ, by scanning Time (ns) 200 200 the scope stack, in order to perform the memory reference checks. 150 150 Thus, all these works provide © ¨ ¦ F algorithms for checking both 100 100 the single parent rule and the memory reference checks. 50 50 Some of the work present in literature, on compositional pointer 0 and escape analysis, such as [14], could be used as compile time 400 Max 2 Standard Deviation techniques to remove, in some cases, run-time checks. But unde- 350 cidability issues may imply that some, perhaps many, checks may Display Based Algorithm 300 1.5 Parent Traversal Algorithm be required at run-time. These techniques could be combined with 250 the algorithms proposed in this paper in order to provide a good Time (ns) 200 1 speedup, and more predictability to RTSJ applications. 150 The concept of RTSJ memory areas, is borrowed from the more 100 0.5 general concept of regions which was first introduced by Tofte et 50 al., in [13]. While, the display based approach for constant time 0 0 1 2 4 8 16 32 64 0 0 1 2 4 8 16 32 64 type-extension type test was first introduced by Cohen in [12]. The Distance Distance main difference between our case and the approach described in [12] is that our type hierarchy changes with time, so the type en- Figure 7: Performances comparison between Display based vs. coding cannot be fixed at compile time. Parent traversal algorithm. 6. CONCLUDING REMARKS Figure 7 shows the average, 99%, maximum, and standard de- viation for the two algorithms. Figure 8 shows the average check We have introduced the concept of parenthood tree, and shown time, the difference between the two averages, and the speedup. how the memory reference checking problem can be reformulated As can be seen from both Figure 7, and Figure 8, the display- as a subtype-testing problem on a type hierarchy associated with based memory-reference check outperforms the parent-traversal- the parenthood tree. We have presented algorithms that reduce the based check in each of the test cases. Moreover, as claimed in Sec- time necessary to support the RTSJ-mandated checks from linear to tion 3.2, the experiments confirm that the checks execute in con- constant-time. The algorithms are implemented in jRate which is open source and available for experimentation. Our results confirm 2 The RDTSC is a 64-bit counter that can be read with the x86 as- the predictability of our approach as well as its overall efficiency. sembly instruction RDTSC. 3 jRate uses a custom encoding for those classes that require fre- 7. REFERENCES quent instanceof tests. This allows instanceof to be re- placed by an integer comparison or a bitwise-and operation. [1] K. Arnold, J. Gosling, and D. Holmes. The Java 4 RTJPerf is currently the only available RTSJ benchmarking suite Programming Language. Addison-Wesley, Boston, 2000.
  • 8. [2] D. F. Bacon, P. Cheng, and V. T. Rajan. A real-time garbage collector with low overhead and consistent utilization. In Proceedings of the 30th ACM SIGPLAN-SIGACT symposium on Principles of programming languages, pages 285–298. ACM Press, 2003. [3] W. S. Beebee and M. Rinard. An implementation of scoped memory for real-time Java. Lecture Notes in Computer Science, 2211, 2001. [4] Bollella, Gosling, Brosgol, Dibble, Furr, Hardin, and Turnbull. The Real-Time Specification for Java. Addison-Wesley, 2000. [5] P. Cheng and G. Belloch. A parallel, real-time garbage collector. ACM SIGPLAN Notices, 36(5):125–136, May 2001. [6] I. Coorporation. Using the RDTSC Instruction for Performance Monitoring. Technical report, Intel Coorporation, 1997. [7] A. Corsaro and D. C. Schmidt. Evaluating Real-Time Java Features and Performance for Real-time Embedded Systems. £ In Proceedings of the¡ ¢  IEEE Real-Time Technology and Applications Symposium, San Jose, Sept. 2002. IEEE. [8] A. Corsaro and D. C. Schmidt. The Design and Performance of the jRate Real-Time Java Implementation. In R. Meersman and Z. Tari, editors, On the Move to Meaningful Internet Systems 2002: CoopIS, DOA, and ODBASE, pages 900–921, Berlin, 2002. Lecture Notes in Computer Science 2519, Springer Verlag. [9] GNU is Not Unix. GCJ: The GNU Complier for Java. http://gcc.gnu.org/java, 2002. [10] R. Jones and R. Lins. Garbage Collection Algorithms for Automatic Dynamic Memory Management. Wiley Sons, New York, 1996. [11] M. A. d. M.-C. M. Teresa Higuera-Toledano. Dynamic Detection of Access Errors and Illegal References in RTSJ. £ In Proceedings of the¡   IEEE Real-Time Technology and Applications Symposium, San Jose, Sept. 2002. IEEE. [12] Norman H. Cohen. Type-Extension Type Tests Can Be Performend In Constant Time. ACM Transactions on Programming Languages and Systems (TOPLAS), 1991. [13] M. Tofte and J.-P. Talpin. Region-based memory management. Information and Computation, 132(2):109–176, Feb. 1997. [14] J. Whaley and M. Rinard. Compositional pointer and escape analysis for Java programs. ACM SIGPLAN Notices, 34(10):187–206, 1999.