Previous article

Next article

Remote Objects: The Next Garbage Collection Challenge

Witawas Srisa-an and Mulyadi Oey
Department of Computer Science and Engineering, University of Nebraska-Lincoln, United States


PDF Icon
PDF Version


In this paper, we present an analysis of remote objects in Microsoft’s Shared Source Common Language Infrastructure. The contribution of our work is threefold. First, we analyze the behavior of remote objects. We find that the basic behavior of these objects significantly differ from the ones of local objects, which have been thoroughly studied in the past. We also study the behavior of remote objects with respect to different activation modes (i.e. single-call, singleton, and client-activated). Second, based on those behavioral differences, we study the impacts of managing remote objects with a generational garbage collector that is designed essentially to manage local objects. We find that the garbage collection efficiency degrades significantly when the heap is interspersed with both local and remote objects. Third, we suggest various optimization techniques to improve the garbage collection efficiency in distributed objects environments.


Web services computing is an emerging technology for developing and deploying distributed applications. The main goal of Web services is to provide an infrastructure for applications to communicate with each other using the World Wide Web [24, 33]. By using Web services, applications from different system architectures (e.g. mainframe, client/server, etc.) can easily exchange information without having to rely on vendor specific middleware components.

Currently, the two major technologies that support Web services are Sun’s Java 2 Enterprise Edition (J2EE) and Microsoft’s .NET Framework, which is based on the Common Language Infrastructure (CLI) standard [16]. According to industry observers, Sun will have 40% of the new enterprise application market and Microsoft will have 30% by the end of this year [22]. They also reported that “Web services will become the dominant distributed computing architecture in the next ten years and will eventually define the fabric of computing” [19]. Thus, it is not surprising that the revenue for Web services is expected to be in excess of twenty one billion dollars by 2007 and twenty seven billion dollars in 2010 [19].

In addition to Web services, distributed applications can be developed and deployed using Microsoft’s .NET Remoting framework. Semantically, remoting is very similar to Java Remote Method Invocation (RMI). However, remoting is architecturally different from RMI in that remoting does not require stubs nor interfaces [34]. In .NET, Web services is a special type of remoting that runs under Internet Information Services (IIS) [2]. Remoting is not only utilized for cross-platform communication and heterogeneous systems, as in Web Services, but also is optimized for communication between .NET-centric applications. More importantly, .NET Remoting provides mechanisms that work with stateful objects. This feature will potentially allow remoting to be the foundation of the next distributed applications generation [20].

To the best of our knowledge, there have been no previous work to characterize the behavior of distributed objects related to either Remoting or Web services. In addition, the information about the effect of these objects on the garbage collector performance is very limited. This paper represents one of the first attempts to study the behavior of remote objects and their impacts on the garbage collection (GC). The contributions of our work are as follows:

  • Characterization of remote objects—we classify remote objects as any objects created directly or indirectly to service requests from remote clients [17]. Our study encompasses different activation modes that include both server-activated (singlecall and singleton) and client-activated. The results of our study show that the majority of remote objects in our benchmark program live significantly longer than local objects when singleton and client-activated modes are used.
  • Analysis of generational garbage collection—we analyze it by monitoring the number of remote objects that are long-lived. We hypothesize that the efficiency of generational garbage collector is greatly reduced because the heap is interspersed with both local and remote objects; and those local and remote objects behave differently. The experiments show that the long-lived remote objects greatly degrade the efficiency of the garbage collector.

To perform our study, we have created a calendar program that can be configured to use different activation modes. The workload is varied by changing the number of clients that are simultaneously requesting services. It is worth noting that our benchmark program is created to represent the basic mechanisms of invoking remote methods and interfacing with remote objects. Our application is intended to be a case-study of remote object behavior based on different activation methods, which are fundamental to distributed application development in .NET infrastructure. In spite of a small amount of work performed for each client’s request, we have already seen that remote objects have longer lifespan than that of the local ones in our application. Thus, with heavier/real-world workload, the lifespan of remote objects may even be longer and result in less efficiency for generational garbage collection.

The remainder of this paper is organized as follows. Section 2 introduces related work and background information. Section 3 discusses the rationales for our hypothesis. Section 4 presents the experiments. Section 5 presents the results obtained from our experiments. Section 6 discusses the future work and the last section summarizes this paper.


This section provides an overview of other studies of the object behavior. It also provides background information related to the Shared Source Common Language Infrastructure (SSCLI) which is the experimental platform of our research. The related work is provided
in section 2 and the background information is provided in section 2.

Related Work

As of now, very little research effort has been spent to study the object behavior in distributed Object-Oriented applications. While the extensive study of SPECjvm98 [26] benchmarks by [4] yielded many insights into the allocation and garbage collection behavior of Java programs, SPECjvm98 does not represent distributed application and server workloads. In [32], a study was performed to investigate whether the CLI implementations can be “useful for high-performance computing.” A large set of benchmarks was used to compare the performance of four CLI implementations. Again, none of the benchmarks represent server-type and distributed workloads. In [11], a performance study of SPECjAppServer2002 [28] was performed. SPECjAppServer2002 is an application Server benchmark based on the Java 2 Enterprise Edition technology. The study mainly concentrated on the micro-architecture level and not at the object behavior level.

In [1], the the effectiveness of pretenuring is studied. Pretenuring is an extension to the generational garbage collection to more efficiently managed long-live objects. A profile based approach is used to select objects for pretenuring. The idea is to provide profile information to the compiler so that the optimal object’s birthplace is available at runtime. They classify objects into three different classes-short-lived, long-lived, and immortal. They report up to 30% improvement in GC time and 7% improvement in the overall system performance. It is worth noting that their study is mainly based on desktop applications with one server that is not distributed in nature. We expect that their approach may generate higher performance gains in distributed environment.

In [10], a thorough characterization of memory system behavior of SPECjbb2000 and SPECjAppServer2001 was performed. SPECjbb2000 [29] is a benchmark to evaluate the performance of servers running typical Java business applications. It represents an order processing application for a wholesale supplier. SPECjAppServer2001 [27] is a client/server benchmark to measure the performance of Java Enterprise Application Servers using a subset of J2EE API’s in a complete end-to-end web application. Their work [10] mainly studied the performance of cache memory with a portion of the work for a study of the effect of garbage collection on cache performance. In [13, 21], workload characterization of SPECjbb2000 and VolanoMark [12] was performed. VolanoMark is a multithreaded chat room application. Again, both studied the performance at the computer architecture level and not from the object perspective.

Background Information

Shared Source Common Language Infrastructure (SSCLI)

The main objective of the CLI is to allow programmers to develop component-based applications where the components can be constructed using multiple languages (e.g. C#, C++, Python, etc.). ECMA-3351 (CLI) standard describes “a language-agnostic runtime engine that is capable of converting lifeless blobs of metadata into self-assembling, robust, and type-safe software systems” [31]. There are several implementations of this standard that include Microsoft’s Common Language Runtime (CLR), Microsoft’s Shared Source Common Language Infrastructure (SSCLI), Microsoft’s .NET Compact Framework, Ximian’s Mono project, and GNU’s dotnet project. For this research, we use the SSCLI due to the availability of the source code. Moreover, it seems to be the most mature implementation than the Mono or GNU ’s dotnet projects.

SSCLI is a public implementation of ECMA-335 standard. It is released under Microsoft’s shared source license. The code base is very similar to the commercial CLR with a few exceptions. First, the SSCLI does not support ADO.NET and ASP.NET which are available in the commercial CLR. ADO.NET is a database connectivity API and ASP.NET is a web API that is used to create Web services. However, the SSCLI does support remoting, which enables us to construct basic Web services mechanisms via remoting with Simple Object Access Protocol (SOAP) encoding and Hypertext Transfer Protocol (HTTP) communication channel. SOAP is an open standard sanctioned by the World Wide Web Consortium (W3C). Second, the SSCLI uses a different Just-In-Time (JIT) compiler from the CLR. The latter provides a more sophisticated JIT compiler with the ability to pre-compile code. Notice that both implementations of the CLI adopt JIT compilation and not interpretation mode as in some earlier Java Virtual Machine implementations. Third, it is designed to provide maximum portability. Thus, a software layer called Portable Adaptation Layer (PAL) is used to provide Win32 API for the SSCLI. Currently, the SSCLI has been successfully ported to Windows, FreeBSD, and MacOS-X operating systems.

Remotable versus Remote Objects

The .NET Remoting framework classifies objects into two categories: nonremotable and remotable. There are three categories of remotable types: marshal-by-value, marshal-byreference, and context-bound [15]. Marshal-by-value remotable type is declared by using
the Serializable attribute. Marshal-by-reference remotable type is defined by deriving from System.MarshalByRefObject. Simply deriving from this class enables the instances (plus the methods) of the type to be remotely-accessible. Context-bound remotable type is a refinement of marshal-by-reference type. Context-bound type is derived from System.ContextBoundObject class, which itself inherits from System.MarshalByRefObject. Therefore, remotable objects can be “accessed outside their application domain or context using a proxy, or they can be copied and these copies can be passed outside their application domain or context; that is, some remotable objects are passed by reference and some are passed by value” [18].

In addition, there are two ways to activate remotable objects—client and server activations. The server-activated objects can be further categorized into single-call and singleton. A client-activated object is a server-side object whose lifetime is mainly controlled by the client application [2]. It is commonly used in multi-tier client/server applications that allow clients to make a series of method invocations on the same server to complete one long and complex business transaction [17]. On the other hand, the lifetime of a server-activated object is managed by the server. A single-call object is created by the server to serve only one client request. When the client invokes a method on a single call object, the object constructs itself, performs appropriate actions, and then is subject to garbage collection [2]. Thus, single-call objects are stateless. Single-call is often used for load balancing [14]. On the contrary, a singleton object is created by the server to serve multiple clients that share information. As a result, singleton objects are stateful and tend to live for the duration of a program [2]. Singleton is often used as listener threads in web server and database server [3].

In this paper, we define remote objects as objects created to service remote requests. Specifically, remote objects are objects created within a remote method; moreover, if the remote method calls other methods, objects created within those methods are also considered as remote objects. Thus, our definition of remote objects encompasses marshalby-value and marshal-by-reference remotable types as well as all connected objects that they reference. Figure 1 shows the difference between remotable and remote objects. The squares denote remotable objects and the three circles within a semicircle denote remote objects. Those remote objects are created by a remote method within the remotable object as part of method calls by the clients.

Garbage Collection in the SSCLI

The SSCLI adopts generational collection technique to manage objects. It is worth noting that any objects larger than 85,000 bytes are considered large objects and managed differently. The generational scheme employs two generations: ephemeral and mature generations. The default sizes as specified in the SSCLI source code are 800 K-bytes and 1 M-bytes, respectively. Intergenerational pointers are maintained using card marking [9, 25] where each card is 4 K-bytes. Objects from unmanaged code are also managed by the garbage collector; handle list is used to store references coming from unmanaged environment. In this approach, all objects that are not large objects are created in the ephemeral space. Any objects that survive ephemeral collection would then be moved to the mature region.

Figure 1: Overview of different activation models in the benchmark program.


As stated earlier, the main goals of this research are (i) to characterize the behavior of remote objects and (ii) to study their effects on garbage collection. We hypothesize that the behavior of remote objects differ from those of local objects and, thus, may degrade the efficiency of generational garbage collectors (such as the one in the SSCLI). The rationales for our hypothesis are as follows:

  1. In distributed computing, the lifespan of remote objects would be much longer than local objects. We base our hypothesis on the work by [6] where the experimental results show that over 80% of objects that are connected together tend to die together. Based on [2], singleton object tends to live for the duration of the server program. For a client-activated object, the default lifespan used in the SSCLI is five minutes. If the client still needs to access the object after the initial lease time, re-leasing mechanism can be used to further extend the object’s life. It is also possible that programmers can override this initial lease time with other values (e.g. 30 seconds). Since these objects are the roots of objects clusters, other objects connected directly or indirectly to either singleton or client-activated objects should be long-live as well.
  2. Since all objects (except those larger than 85,000 bytes) are initially created in the ephemeral space and more remote requests result in more remote objects being created, remote objects will occupy the majority of the ephemeral space. As mentioned in 1, these objects may be long-live. Therefore, the initial premise of generational schemes that “the majority of objects die young” may no longer be true in remoting applications. In fact, the generational garbage collection efficiency may degrade significantly.

Our goal of this paper is to prove the correctness of our hypothesis. We perform experiments to show that there are a lot of long-lived objects in distributed applications. Once we establish the fact that a large number of objects are long-lived, we perform more analysis to show that the majority of these long-lived objects are remote. Lastly, to make sure that we have adequate ephemeral generation size for our experiment, we compare the survival rate of remote and local objects based on the allocation request for each type in between two GC invocations. In doing so, we demonstrate that remote objects are indeed long-lived.


This section describes our experimental environment. The description includes the detailed overview of our benchmark programs, the detailed modifications made to the SSCLI, and the analysis tools to study the behavior of remote objects. We conduct our experiments on Windows XP Professional workstation running on 2.6 GHz Pentium IV with Hyper-Threading [8]. The system has 512 MB of memory.

Benchmark Program

Currently, there are no standardized benchmark programs for distributed application in .NET environment. In addition, the SSCLI does not have a complete set of libraries as in the commercial CLR. Therefore, the benchmark for our experiment must utilize basic mechanisms to invoke and interface with distributed objects and execute correctly in the SSCLI. As a result, we create a benchmark program that can be easily customized to use different activation modes and to support a large number of concurrent clients. As stated in the introduction, it is not our intention to create a benchmark program that emulates real-world workloads as different applications would exhibit different workload behavior. On the contrary, our application is intended to be a case-study of remote object behavior based on different activation modes (singleton, single-call, and hybrid). The three activation modes are used. We then compare the differences in object behavior among different modes. The basic characteristic of the benchmark program is summarized in Table 1.

Our benchmark is a three-tier client/server calendar program, as depicted in Figure 1. The primary server waits for client connections, forwards each client’s requests to the secondary XML server, which queries corresponding information from an XML file, and then returns the results back to the clients. Since the primary and secondary servers operate in two different application domains, they also need remoting mechanism to communicate with one another. The connection between the primary server and the XML server is established using the singleton mode. It is worth noting that we use HTTP channel and SOAP formatter to emulate the behavior of Web-service applications.

Table 1: Benchmark Characteristics

The server and the client programs can be configured to use single-call, singleton, or client-activated mode for the remotable object activation. The basic overview of the three activation models is given in Figure 1. In our implementations of the single-call and the singleton models, every client makes two similar requests—each request is to retrieve all appointment details for a particular day. For the client-activated model, each client makes two different requests—the first one is to retrieve only the appointment subjects for a particular day and the second is to get the detailed information of a particular appointment.

It is worth noting that a hybrid implementation is used to exercise the client-activated model. The hybrid implementation is preferred to its pure client-activated model counterpart because no compiled server objects needs to be shipped to the client. Shipping compiled server objects violates the principle of distributed objects and is undesirable due to deployment and versioning issues [17]. In the hybrid model, a client makes a connection through a main singleton object in the server, which then instantiates a client-activated object for the corresponding client. The singleton object serves as a factory object to create query objects for the calendar program. One additional proxy object is then set up on the client side so that it can directly access the newly-instantiated client-activated object in the server. The terms client-activated and hybrid are used interchangeably throughout this paper.

We vary the testing workload by changing the number of simultaneous clients (i.e. 15, 30, and 60 clients) for each of the three—single-call, singleton, and hybrid—models. The benchmark allocates over 384,000 objects and 24 M-bytes in the hybrid model with 60 clients. Notice that the number of objects created in our benchmark is similar to the number of objects created in well accepted client/server benchmarks such as VolanoMark [12]. For instance, in our benchmark with 15 clients, the number of objects is about 200,000. For VolanoMark with 20 clients, there are about 257,000 objects [7]. The program also compiles over 3,400 methods during its execution. The comparison of object behavior among these three models is given in section 5.

Trace Generation and Analysis

We perform our experiments by running the benchmark with different configurations on the modified SSCLI. The modified SSCLI is an SSCLI in which the source code is modified to generate information related to thread creation, JIT compilation, object allocation, garbage collection, thread termination, etc. The information is then piped to a trace file. The basic overview of our experimental platform is provided in Figure 2.

Figure 2: Overview of the experimental platform.

Each time a remote method is entered, the modified SSCLI will generate a line in the trace file. The line includes the method name and a unique identification number of a particular thread executing the method. Any objects created by the same thread while the remote method is still active are considered to be remote objects. Since our benchmark multithreaded, we segregate concurrent allocation requests from different threads by generating a thread identification number as part of the object allocation trace line. For example, since the workstation used for the experiment has a Hyper-Threading capability, is possible for two threads from the same application domain to execute simultaneously. However, by recording the thread identification number as part of the object allocation trace line, we can precisely identify whether the object is local or remote.

It is also possible for the thread that executes a remote method to delegate some works other threads in the same application domain. The most common approach is to create pool of threads for the delegated tasks. Since these threads also perform works to satisfy remote requests, the objects created by these worker threads are also considered as remote objects.

The complete trace file is then used as the input of the analysis tool, which is used identify each object’s type (i.e. local or remote), calculate the garbage collection efficiency, compute the object size distribution, and so on. The result is then outputted to an analysis result file. The result is discussed in the next section (section 5).


Basic Behavior of Remote Objects

We initially hypothesize that the majority of objects in the heap will be remote objects (i.e. remotable objects and any objects connected to them). However, as shown in Figure 3, this is not the case. The ratios of remote and local objects in both single-call and singleton models are close to half (52% for local and 48% for remote). For the hybrid model, each client request results in more local objects created. Such objects include leasing managers and other structurally complex objects for keeping information across states, to support
additional runtime requirements. Therefore, the amount of space for local objects also increases as reflected in Figure 3.

Figure 3: Ratio of remote versus local objects in the benchmark applications.

We also find very few differences between the local and remote object size distributions. Studies by [4, 35] find that the average object size of Java programs is less than 50 bytes. Another study by [23] finds that a high percentage of objects is smaller than 512 bytes. Figure 4 depicts the local and remote size distributions for all the three models with 60 clients. It shows that most of the objects (local and remote) are smaller than 128 bytes.

Figure 4: Size distribution of remote and local objects in the benchmark applications.

In terms of lifespan, we find that a large number of objects survive ephemeral collections. A detailed illustration of such objects is given in Figure 5. For example, in the single-call model with 30 clients, we find that the survival ratios are about 40%. Notice that when the number of clients increases to 60, the SSCLI enlarges the ephemeral generations from 800 K-bytes to 2,600 K-bytes in case of single-call, 3,500 K-bytes in case of singleton and 5,800 K-bytes in case of hybrid toward the end of the execution.

Figure 5: Illustration of surviving objects for each GC invocation.

Table 2: Survival rates

Table 2 provides the aggregated results of our finding. For example, the hybrid model with 30 clients has the survival rates ranging from 25 to 53%, with an average of 36.71%. We find that the averages of the survival rates fall between 30 to 39% in all configurations. For a comparison, we use a word count utility program, which is included as part of the SSCLI test suite, to represent a common desktop application. The utility is used to count the number of characters, words, and lines in one of our trace files. The application allocates 8 M-bytes of memory and invokes 11 ephemeral garbage collections. We find that the objects’ average survival ratio in the application is only 16% and that the maximum survival ratio is only 25%, which is smaller than the average survival ratio in our remoting benchmark application.

Distribution of Long-lived Objects

In this section, we perform a detailed comparison between the distributions of long-lived local and long-lived remote objects. By monitoring the objects that are promoted during each ephemeral garbage collection, we can compare the amount of remote and local objects that are long-lived. For example, we calculate the amounts of local (Lo) and remote (Ro) objects in the young generation before and after each GC. We also calculate the amounts of local (Lm) and remote (Rm) objects that survive the ephemeral collections (i.e. promoted to the mature generation). Thus, we can express the percentage of survival as ,where PL and PR are the percentages of survived local objects and survived remote objects, respectively.

Figure 6 provides detailed distributions between long-lived remote and local objects per GC invocation. The main objective is to illustrate that the majority of long-lived objects are remote. Due to space limitation, we only include the distributions in the three models with 60 clients as representatives of other workloads. As illustrated in the figure, most objects that survive the majority of GC invocations are remote objects.

Figure 6: Distributions of long-lived objects per GC invocation.

Potential Effect to the Local Collector

As stated earlier, we hypothesize that the introduction of remote objects to the same heap would degrade the efficiency of generational GC. As a reminder, the efficiency of generational GC is mostly determined by the amount of objects that has to be migrated to the mature region. The basic rationale behind generational scheme is that “the majority of objects die young” [9] and thus, less object will be promoted during each ephemeral collection. The efficiency of a garbage collector is defined as the amount of garbage collected in a given time [9]. As illustrated thus far, remote objects in distributed applications tend to live longer. Therefore, the amount of garbage collected in each invocation would be less and the collection time would be longer. We intend to prove our hypothesis by showing that the remote objects are indeed long-lived.

To perform our preliminary analysis, we compare the behavior of local and remote objects based on the amount of allocation during an ephemeral garbage collection. To illustrate our technique, let us consider the following. Figure 7 depicts the distribution of allocated objects that are remote and local. We record the information just prior to each GC. For example, we investigate the fifth and sixth GC invocations. We find that the amount of remote allocation in the fifth invocation is nearly identical to the amount of local allocation in the sixth. Again, the size of ephemeral generation is maintained at 800 K-bytes. What we want to monitor here is the amount of survived objects after an ephemeral GC is invoked. In this example, we find that the percentage of long-lived local objects in the 5th invocation is 30% whereas the percentage of long-lived remote objects in the 6th invocation is 52%. In this approach, we eliminate one of the common pitfalls in lifespan study of the generational scheme which is the adequacy of the generation size. It is possible that the default ephemeral generation size is too small and therefore a large number of objects are migrated regardless whether they are local or remote. When the young generation size is too small, both remote and local objects would have a very similar chance of getting promotion. However, we can see that generation size is not a big factor in our analysis. As clearly shown in Figure 8, given the same allocation space, remote objects are likely to live longer than local objects.

Figure 7: Allocation distribution of remote and local objects in singleton model with 60 clients.

Figure 8: Lifespan comparisons between local and remote objects in three activation models.

To compare the lifespan of remote and local objects, we focus on the amount of survived objects during ephemeral collections. Figure 8 compares the amount of survivors based on the young generation occupancy (Lo and Ro) in single-call, singleton, and hybrid activation models. The X-axis represents the amount of space allocated, in K-bytes, prior to each ephemeral garbage collection. The Y-axis represents the percentage of survived objects. Since we record Lo, Ro, Lm, and Rm before and after each ephemeral GC, we can compare the survival ratios based on the amount of object allocated. When the number of simultaneous clients are 1 and 15, the experimental results indicate that the lifespan of remote objects is longer than that of local objects. When we increase the number of simultaneous clients to 30 and 60, it is conclusive that the lifespan of remote objects is much longer than that of local objects. In the majority of ephemeral garbage collection invocations, over 40% of the remote objects survive. On the other hand, very few GC invocations indicate the survival rates to be above 40% for local objects. It is worth noting that isolated data points in cases of 60 clients (e.g. between 1,500 and 2,000 K-bytes in singleton) are the result of ephemeral space enlargement performed by the SSCLI to accommodate heavier workload. The actual enlarged heap size was previously presented in Figure 5.

Figure 9 shows the percentage of total ephemeral garbage collections that results in more than 40% survival rate for local and remote objects. In case of singleton model with 60 clients, there are 15 ephemeral collections. Out of these 15, there is one collection in which 40% of local objects still alive and there are nine collections in which 40% of remote objects still alive. In other words, only in 6.67% of the total ephemeral collections that local objects have 40% survival rate. However, 40% survival rate for remote objects happen in 60% of the total ephemeral collections.

Figure 9: Percentage of ephemeral collections that results in over 40% survival rate.

From our experimental results, it is clear that remote objects are long-lived. Therefore, the garbage collector will be likely to spend additional time and resources to promote these long-lived remote objects.


This paper represents one of the first attempts to study object behavior in distributed Object-Oriented applications. Based on the experimental results, we can see that remote objects have different lifespan compared to local objects. For this experiment, we use our micro-benchmark that can be configured to use different object activation modes and support various number of concurrent clients. For future work, we will create a set of benchmarks that performs more complex functions and utilizes more advanced threading techniques (e.g. thread pool for work delegation). As stated earlier, there is presently no standardized benchmarks for remoting.

In this paper, we demonstrate that remote objects tend to be long-lived. In the future, we will experiment with various optimization techniques to improve the efficiency of generational garbage collection. For example, adaptive and dynamic pretenuring [1] can be used to directly create remote objects in the mature generation. We will also experiment to manage remote objects separately. In addition, our results clearly indicate that workload can greatly affect the object creation and garbage collection. We plan to investigate different algorithms that would pre-enlarge the heap during the thread creation or thread join; moreover, we plan to investigate the amount of objects shared by multiple threads in distributed applications. If very few objects are shared, it is possible to improve the performance by adopting algorithms such as thread specific and thread local heaps [5, 30].


Based on the experimental results, remote objects in distributed applications have much longer lifespan than that of local objects. We determine the lifespan of each object type by comparing the amount of survived objects given the same amount of allocation space. We find that in most instances, local objects rarely have survival rates of more than 40%. On the contrary, remote objects constantly maintain the survival rates of 40% or more. We conclude that a typical generational collector, such as the one in the SSCLI, would lose its efficiency in a distributed environment because more time will be needed to promote the long-lived remote objects.


We would like to thank Dr. Sebastian Elbaum for offering many valuable suggestions. This project was partially supported by the National Science Foundation under grant CNS-0411043 and Univ. of Nebraska Layman’s Award.


[1] S. M. Blackburn, S. Singhai, M. Hertz, K. S. McKinely, and J. E. B. Moss. Pretenuring for java. In Proceedings of the OOPSLA ’01 conference on Object Oriented Programming Systems Languages and Applications, Tampa Bay, FL, 2001.

[2] D. Browning. Integrate .net remoting into the enterprise. In .NET Magazine, November 2002.

[3] Cunningham. Singleton pattern. Cunningham and Inc.

[4] S. Dieckmann and U. Holzle. A study of the allocation behavior of the specjvm98 java benchmarks. In Proceedings of the European Conference on Object-Oriented Programming (ECOOP’99), Lecture Notes on Computer Science, Springer Verlag, Lisbon, Portugal, June 1999.

[5] T. Domani, G. Goldshtein, E. K. Kolodner, E. Lewis, E. Petrank, and D. Sheinwald. Thread-local heaps for java. SIGPLAN Not., 38(2 supplement):76–87, 2003.

[6] M. Hirzel, J. Henkel, A. Diwan, and M. Hind. Understanding the connectivity of heap objects. In ISMM, Berlin, Germany, 2002.

[7] W. Huang, Y. Qian, W. Srisa-an, and J.M. Chang. Object allocation and memory contention study of java multithreaded applications. In Proceedings of 23th IEEE International Performance, Computing, and Communications Conference (IPCCC), pages 375–382, Phoenix, Arizona, April 15-17, 2004.

[8] Intel. Hyper-threading technology.

[9] R. Jones and R. Lins. Garbage Collection: Algorithms for automatic Dynamic Memory Management. John Wiley and Sons, New York, NY, 1998.

[10] M. Karlsson, K. E. Moore, E. Hagersten, and D. A. Wood. Memory system behavior of java-based middleware. In Proceedings of the The Ninth International Symposium on High-Performance Computer Architecture (HPCA’03), page 217. IEEE Computer Society, 2003.

[11] S. Kumar. A performance study of specjappserver2002. In First Workshop on Managed Run Time Environment Workloads, San Francisco, CA, March 23, 2003.

[12] Volano LLC. Volanomark benchmark.

[13] Y. Luo and L. John. Workload characterization of multithreaded java servers. In Proceedings of 2001 IEEE International Symposium on Performance Analysis of Systems and Software, pages 128–136, Austin, Texas, 2001.

[14] N. Maharaj. .net remoting-part 3 remoting examples. In C# Help,

[15] S. McLean, J. Naftel, and K. Williams. Microsoft .NET Remoting. Microsoft Press, 2003.

[16] Microsoft. ECMA and ISO/IEC C# and common language infrastructure standards.

[17] Microsoft MSDN. Broker.

[18] Microsoft MSDN. Remotable and non-remotable objects. cpguide/html/cpconremotablenon-remotableobjects.asp.

[19] Web Hosting Industry News.

[20] I. Rammer. Advanced .NET Remoting. Apress, 2002.

[21] P. Seshadri and A. Mericas. Workload characterization of multithreaded java servers on two powerpc processors. In Proceedings of Fourth Annual Workshop on Workload Characterization, Austin, Texas, December 2001.

[22] D. Sholler. .net seen gaining steam in dev projects. In ZD Net,,14179,2860227,00.html, April 2002.

[23] T. Skotiniotis and J. M. Chang. Estimating internal memory fragmentation for java programs under the binary buddy policy. In Proceedings of IEEE International Symposium on Performance Analysis of Systems and Software (ISPASS-2001), pages 85–92, Tucson, Arizona, Nov. 4-6, 2001.

[24] B. Sleeper and B. Robins. The laws of evolution: A pragmatic analysis of the emerging web services market. scope 200204evolution.pdf. The Stencil Group.

[25] P. Sobalvarro. A lifetime-based garbage collector for lisp systems on general-purpose computers. Technical Report AITR-1417, MIT, February 1988.

[26] SPEC. Standard performance evaluation corporation jvm98.

[27] SPEC. Standard performance evaluation corporation jappserver2001.

[28] SPEC. Standard performance evaluation corporation jvm98.

[29] SPEC. Standard performance evaluation corporation jbb00. (

[30] B. Steensgaard. Thread-specific heaps for multithreaded applications. In Proceedings of International Symposium on Memory Management, pages 18–24, Minneapolis, MN, October 15-16, 2002.

[31] D. Stutz, T. Neward, and G. Shilling. Shared Source CLI Essentials. O’Reilly and Associates, 2003.

[32] W. Vogels. Benchmarking the cli for high performance computing. IEE Proceedings Software, 150:266 –274, October 2003.

[33] W3C. World Wide Web Consortium.

[34] R. Wiener. Remoting in c# and .net. Journal of Object Technology, 3:83–100, January 2004.

[35] Q. Yang, W. Srisa-an, T. Skotiniotis, and J. M. Chang. Java virtual machine timing probes: A study of object lifespan and garbage collection. In Proceedings of 21st IEEE International Performance Computing and Communication Conference (IPCCC-2002), pages 73–80, Phoenix Arizona, April 3-5, 2001.

About the authors

Witawas Srisa-an is an Assistant Professor in the Department of Computer Science and Engineering ( at University of Nebraska-Lincoln, USA. His research interests include computer architecture, Object-Oriented systems, programming languages, and distributed systems. He can be reached at

Mulyadi Oey is a second year MS student and research assistant in the Department of Computer Science and Engineering at University of Nebraska-Lincoln, USA. He can be reached at

Cite this column as follows: Witawas Srisa-an and Mulyadi Oey: “Remote Objects: The Next Garbage Collection Challenge", in Journal of Object Technology, vol. 4, no. 4, May-June 2005, pp

Previous article

Next article