1. Field of the Invention
This invention relates to the design, coding, and maintenance of object-oriented applications in computer systems and, more particularly, to efficient use of memory for, caching of, and garbage collection of classes in computer systems.
2. Description of the Related Art
In object-oriented programming, such as programming in the Java® programming language, it is increasingly common to make classes and their instances (objects) immutable. A class in object-oriented programming may be referred to herein as immutable if the state of an instance of the class does not change over its lifetime. The use of immutable classes provides a number of potential advantages in the design, coding, and maintenance of multi-threaded applications. For example, multiple threads may share instances of immutable classes in a safe manner because none of the sharing threads change the immutable object's state. In many applications, a significant percentage of classes are immutable. For example, in many Java®-based applications, instances of the java.lang.string class account for a significant fraction of the heap. Each string contains exactly one character array, which consists of immutable character objects. Character arrays and strings together may account for a very high percentage of the objects in a system.
It may be desirable to reduce the number of objects in a heap to minimize storage requirements. It may also be desirable to reduce the number of objects to be managed so that garbage collection may be performed more efficiently. These and any other improvements in efficiency in handling immutable classes may have a desirable effect on performance of virtual machines, such as are found in Java®-based systems as well as systems that use statically compiled classes. In view of the above, what is needed are improvements to the uses of immutable classes of objects.
Various embodiments of a computer system including at least one processor are disclosed. In one embodiment, the processor identifies a first class and a second class. An instance of the first class includes first data fields and an instance of the second class includes second data fields. The first data fields include a data field that references the second class. In response to determining that the first class is immutable and the second class is immutable, the processor constructs a first synthetic immutable class, an instance of which comprises a combination of the first data fields and the second data fields. The processor creates an instance of the first synthetic immutable class in which the first data fields and the second data fields occupy a contiguous region of a memory.
In one embodiment, a static compiler executing at compile time on the processor identifies the first and second classes, determines that the first and second classes are immutable, and constructs the first synthetic immutable class. In an alternative embodiment, the processor executes a virtual machine. During run time, the virtual machine manages allocation and deallocation of memory for storing class instances, identifies the first and second classes, determines that the first and second classes are immutable, and constructs the first synthetic immutable class.
In response to determining the first synthetic immutable class does not include an accessor for the second class, the processor combines a header field of the first data fields and a header field of the second data fields into a single data field in the first synthetic immutable class. In a further embodiment, the processor identifies a third class. An instance of the third class includes third data fields. The first data fields include a data field that references the third class. In response to determining that the third class is immutable, the processor constructs a second synthetic immutable class, an instance of which includes a combination of the first data fields, the second data fields, and the third data fields. The processor creates an instance of the second synthetic immutable class in which the first data fields, the second data fields, and the third data fields occupy a contiguous region of memory. In response to determining the second synthetic immutable class includes exactly one array, the processor combines a length field of the first data fields and a length field of the array into a single data field in the second synthetic immutable class.
In a still further embodiment, the virtual machine includes a garbage collector that reclaims the contiguous region of memory for other use by the virtual machine in response to determining that an instance of the first synthetic immutable class is no longer reachable by other class instances managed by the virtual machine. In a still further embodiment, the contiguous memory region is included in a single cache line.
While the invention is susceptible to various modifications and alternative forms, specific embodiments are shown by way of example in the drawings and are herein described in detail. It should be understood, however, that drawings and detailed descriptions thereto are not intended to limit the invention to the particular form disclosed, but on the contrary, the invention is to cover all modifications, equivalents and alternatives falling within the spirit and scope of the present invention as defined by the appended claims.
Turning now to
Host hardware 110 generally includes all of the hardware included in computer system 100. In various embodiments, host hardware 110 may include one or more processors, memory, peripheral devices, and other circuitry used to couple the preceding components. For example, common personal computer (PC)-style systems may include a Northbridge coupling the processors, the memory, and a graphics device that uses the advanced graphic port (AGP) interface. Additionally, the Northbridge may couple to a peripheral bus such as the peripheral component interface (PCI) bus, to which various peripheral components may be directly or indirectly coupled. A Southbridge may also be included, coupled to the PCI bus, to provide legacy functionality and/or couple to legacy hardware. In other embodiments, other circuitry may be used to link various hardware components. For example, HyperTransport™ (HT) links may be used to link nodes, each of which may include one or more processors, a host bridge, and a memory controller. The host bridge may be used to couple, via HT links, to peripheral devices in a daisy chain fashion. Any desired circuitry/host hardware structure may be used.
Operating system 120 may be any OS, such as any of the Windows® OSs available from Microsoft® Corp., (Redmond, Wash.), any UNIX®-type operating system such as Linux, AIX® from IBM® Corporation® (Armonk, N.Y.), Solaris® from Oracle®, HP-UX® from Hewlett-Packard Company® (Palo Alto, Calif.), and so forth. Virtual machine 130 may be any virtual machine. For example, the virtual machine 130 may be a Java®-based virtual machine (JVM). A JVM is a virtual machine that is able to execute Java® bytecode. The JVM may be bundled with a set of standard class libraries to form the Java Runtime Environment® (JRE®). Alternatively, the virtual machine 130 may be a Common Language Runtime that supports the .NET Framework® from Microsoft Corporation®. Other examples of virtual machines may be used and are contemplated. For simplicity, in the discussions that follow Java® and the JRE® may be used as examples, although the invention is in no way limited to Java®-based systems.
During operation, caching engine 122 may transfer data and/or instructions between a backing store and cache memory so that data and instructions that are frequently used by operating system 120 and applications running on operating system 120 are readily available. For example, caching engine 122 may make one or more of class files 140 more readily available to virtual machine 130 by transferring them to a cache memory. In some embodiments, the functions of caching engine 122 may be performed by a combination of caching engine 122 and elements of host hardware 110.
When a class is needed by virtual machine 130, it may be dynamically loaded from cache or system memory by class loader 132. Once class loader 132 has loaded a class, virtual machine 130 may allocate space in heap 134 for one or more instances of the class. Execution engine 138 may make use of class instance (objects0 that are allocated in heap 134 as well as their methods that are stored in method area 137. When an instance of class is no longer needed by virtual machine 130, it may be dynamically removed from heap 134 by garbage collector 136.
Assuming by way of example that virtual machine 130 is a JRE®, it is often the case that instances of the java.lang.string class and character arrays account for a significant percentage of the space occupied in heap 134. Turning now to
Turning now to
During run time operation of a (JVM), a class loader may load classes that are needed to create instances. Once a class is loaded, an allocator may allocate a region of heap memory for storage of the class instances. The following modifications may be made to the operation of a JVM or other virtual machine. During a class load operation, a first class may be analyzed to determine if it is truly immutable. Classes that are not immutable may be handled in a conventional manner. Classes that are determined to be immutable may be further analyzed to determine if they reference other classes that are also determined to be immutable. If it is determined that a first immutable class references one or more other immutable classes, the virtual machine may create a synthetic immutable class (SIC) that groups the fields of the first immutable class with those of all other immutable classes that it references. The virtual machine may make whatever code transformations are necessary to handle the layout of the instance of the new SIC. New methods that account for the new SIC layout may be pushed into the methods of the SIC. In various embodiments, instances of the resulting SIC may occupy a single sequence in memory such as described in
It is noted that although the fields of two or more objects have been combined into one SIC instance, it may be desirable to maintain separate headers for the original objects inside the containing instance. In one embodiment, separate headers are maintained to allow for contained instances to be accessible outside of the containing instance. For example, if a string contains an accessor ‘char[ ] getChars( )’ the accessor may be expected to return a reference to the header of the character array object, as would be the case when accessing any other object. In a further embodiment, special handling may be added to a virtual machine to account for a contained object that outlives its containing SIC instance. The following code fragment illustrates this situation:
In an alternative embodiment, it may be determined that the containing SIC instance has no accessors. In other words, there are no reference leaks from the SIC instance. In such cases, internal references between objects in the SIC instance may be eliminated. One embodiment of a resulting, collapsed SIC instance is illustrated in
In another alternative embodiment, if a containing SIC instance contain a single array, as is the case with the string class, additional reductions in an SIC instance may be made.
Any of SIC instances 400, 500, or 600 shown in
The examples and embodiment described above are generally directed to systems that include a virtual machine. However, in alternative embodiments, synthetic immutable classes may be created by a static compiler at compile time if two related classes can be determined to be immutable. Although statically compiled classes are not typically garbage collected, nevertheless, reductions in storage requirements and cache misses may still occur in such embodiments.
For each referenced class in the SIC a determination may be made whether or not the SIC instance includes an accessor for the referenced class (block 820). If the SIC includes an accessor for the referenced class (decision block 830) and if the referenced class is not the last referenced class to be evaluated (decision block 850), another referenced class may be evaluated at block 830). If the SIC does not include an accessor for the referenced class (decision block 830), the headers of the SIC that correspond to the referring class and the referenced class may be collapsed into a single header (block 840). If the referenced class is not the last referenced class to be evaluated (decision block 850), another referenced class may be evaluated at block 830). If the referenced class is the last referenced class to be evaluated (decision block 850), a determination may be made if the SIC includes exactly one array. If the SIC includes exactly one array (decision block 860), the length field of the SIC that corresponds to the length of the array may be collapsed into the length field that corresponds to the length of the entire SIC instance (block 870). If the SIC does not include exactly one array (decision block 860) or after collapsing the length fields, process 800 is complete.
It is noted that the foregoing flow charts are for purposes of discussion only. In alternative embodiments, the elements depicted in the flow charts may occur in a different order, or in some cases concurrently. Additionally, some of the flow chart elements may not be present in various embodiments, or may be combined with other elements. All such alternatives are contemplated.
Although the embodiments above have been described in considerable detail, numerous variations and modifications will become apparent to those skilled in the art once the above disclosure is fully appreciated. It is intended that the following claims be interpreted to embrace all such variations and modifications.
Number | Name | Date | Kind |
---|---|---|---|
4558413 | Schmidt et al. | Dec 1985 | A |
4775932 | Oxley et al. | Oct 1988 | A |
4989134 | Shaw | Jan 1991 | A |
5136706 | Courts | Aug 1992 | A |
5355483 | Serlet | Oct 1994 | A |
5481712 | Silver et al. | Jan 1996 | A |
5530850 | Ford et al. | Jun 1996 | A |
5551003 | Mattson et al. | Aug 1996 | A |
5560003 | Kolodner et al. | Sep 1996 | A |
5561786 | Morse | Oct 1996 | A |
5652883 | Adcock | Jul 1997 | A |
5687368 | Nilsen | Nov 1997 | A |
5751613 | Doty et al. | May 1998 | A |
6081665 | Nilsen et al. | Jun 2000 | A |
6085035 | Ungar | Jul 2000 | A |
6199075 | Ungar et al. | Mar 2001 | B1 |
6300962 | Wishoff et al. | Oct 2001 | B1 |
6470361 | Alpern et al. | Oct 2002 | B1 |
6526422 | Flood et al. | Feb 2003 | B1 |
6560619 | Flood et al. | May 2003 | B1 |
6760815 | Traversat et al. | Jul 2004 | B1 |
6763440 | Traversat | Jul 2004 | B1 |
6804762 | Dussud et al. | Oct 2004 | B1 |
6823351 | Flood et al. | Nov 2004 | B1 |
6826583 | Flood et al. | Nov 2004 | B1 |
6839725 | Agesen et al. | Jan 2005 | B2 |
6865585 | Dussud | Mar 2005 | B1 |
6868488 | Garthwaite | Mar 2005 | B2 |
6901587 | Kramskoy et al. | May 2005 | B2 |
6925638 | Koved et al. | Aug 2005 | B1 |
6931423 | Sexton et al. | Aug 2005 | B2 |
6996590 | Borman et al. | Feb 2006 | B2 |
7010555 | Blandy et al. | Mar 2006 | B2 |
7016923 | Garthwaite et al. | Mar 2006 | B2 |
7017162 | Smith et al. | Mar 2006 | B2 |
7031990 | Garthwaite | Apr 2006 | B2 |
7051056 | Rodriguez-Rivera et al. | May 2006 | B2 |
7065617 | Wang | Jun 2006 | B2 |
7069280 | Garthwaite | Jun 2006 | B2 |
7093231 | Nuss | Aug 2006 | B2 |
7103873 | Tanner et al. | Sep 2006 | B2 |
7120898 | Grover et al. | Oct 2006 | B2 |
7231632 | Harper | Jun 2007 | B2 |
7408782 | Austin et al. | Aug 2008 | B2 |
7412466 | Garthwaite | Aug 2008 | B1 |
7496892 | Nuss | Feb 2009 | B2 |
7614041 | Harper | Nov 2009 | B2 |
7627862 | Chen | Dec 2009 | B2 |
7657899 | Werner | Feb 2010 | B2 |
7827525 | Navaro | Nov 2010 | B1 |
8032860 | Piehler et al. | Oct 2011 | B2 |
8327327 | Bierhoff et al. | Dec 2012 | B2 |
20040039759 | Detlefs et al. | Feb 2004 | A1 |
20040078381 | Blandy et al. | Apr 2004 | A1 |
20040111445 | Garthwaite et al. | Jun 2004 | A1 |
20040111718 | Detlefs | Jun 2004 | A1 |
20040128329 | Ben-Yitzhak et al. | Jul 2004 | A1 |
20040133759 | Sekiguchi | Jul 2004 | A1 |
20040162860 | Detlefs | Aug 2004 | A1 |
20040162861 | Detlefs | Aug 2004 | A1 |
20050114844 | Betancourt et al. | May 2005 | A1 |
20050132374 | Flood et al. | Jun 2005 | A1 |
20050149686 | Bacon et al. | Jul 2005 | A1 |
20050166028 | Chung et al. | Jul 2005 | A1 |
20050198079 | Heeb | Sep 2005 | A1 |
20050235120 | Dussud | Oct 2005 | A1 |
20050240943 | Smith et al. | Oct 2005 | A1 |
20050273567 | Blandy | Dec 2005 | A1 |
20050278497 | Pliss et al. | Dec 2005 | A1 |
20060059453 | Kuck et al. | Mar 2006 | A1 |
20060092161 | Meeker | May 2006 | A1 |
20070255909 | Gschwind et al. | Nov 2007 | A1 |
20080162611 | Wolczko et al. | Jul 2008 | A1 |
Entry |
---|
Riehle, “Value object”, ACM PLoP, pp. 1-6, 2006. |
Porat et al, “Automatic detection of immutable field in Java”, ACM CASCON, pp. 1-15, 2000. |
Kjolstad et al, “Transformation for class immutability”, ACM ICSE, pp. 61-70, 2011. |
Malitsky, “Processing heterenenous abstract syntax trees with the mutable class pattern”, ACM OOPSLA, pp. 697-701, 2008. |
Wilson, Paul R., “Uniprocessor Garbage Collection Techniques,” Technical Report, The University of Texas, Jan. 1994. |
Hudson, et al., “Incremental Collection of Mature Objects,” Proceedings of the Int'l Workshop on Memory Management, 1992, 16 pages. |
Printezis, et al. “A Generational Mostly-Concurrent Garbage Collector,” 1998, 12 pages. |
Lieberman, et al., “A Real-Time Garbage Collector Based on the Lifetimes of Objects,” Communications of the ACM, Jun. 1983, vol. 26, No. 6, pp. 419-429. |
Detlefs, et al., “Garbage-First Garbage Collection,” Sun Microsystems, Inc., 2004, pp. 37-48. |
Bacon, et al., “The Metronome: A Simpler Approach to Garbage Collection in Real-Time Systems,” Springer-Verlag Berlin Heidelberg 2003, pp. 466-478. |
Sachindran, et al., “Mark-Copy: Fast Copying GC with Less Space Overhead,” ACM, 2003, 18 pages. |
Hallenberg, et al., “Combining Region Inference and Garbage Collection”, PLDI '02, Jun. 17-19, 2002, Berlin, Germany. |
“Garbage Collection”; Sep. 27, 2004; 7 pages; printed off website www.memorymanagement.org. |
Abuaiadh, et al; “An Efficient Parallel Heap Compaction Algorithm”; OOPSLA'04; Oct. 24-28, 2004; pp. 224-236; Vancouver, British Columbia, Canada. |
Agesen, et al; “An Efficient Meta-Lock for Implementing Ubiquitous Synchronization”; Sun Microsystems; Apr. 1999; pp. 1-27; SMLI TR- 99-76; Palo Alto, CA; USA. |
Agesen, et al; “Mixed-mode Bytecode Execution”; Sun Microsystems; Jun. 2000; pp. 1-20; SMLI TR-2000-87; Palo Alto, CA; USA. |
Agesen; “GC Points in a Threaded Environment”; Sun Microsystems; Dec. 1998; pp. 1-20; SMLI TR-98-70; Palo Alto, CA; USA. |
Ben-Yitzhak, et al; “An Algorithm for Parallel Incremental Compaction”; IBM Haifa Research Laboratory, Mount Carmel; Jun. 20-21, 2002; pp. 100-105; Berlin, Germany. |
Appel; “Simple Generational Garbage Collection and Fast Allocation”; Department of Computer Science-Princeton Universtiy; Mar. 1998; 16 pages; Princeton, N.J., USA. |
Detlefs, et al; “Inlining of Virtual Methods”; Sun Microsystems Laboratories; 21 pages; Burlington, MA, USA, 1999. |
Flood, et al; “Parallel Garbage Collection for Shared Memory Multiprocessors”; Sun Microsystems; Apr. 2001; USA. |
Martin Larose and Marc Freeley, A Compacting Incremental Collector and its Performance in a Production Quality Compiler, Oct. 1998, Proceedings of the 1st International Symposium on Memory Management ISMM '98, vol. 34, Issue 3. |
Applying priorities to memory allocation, Robertz, et al.; ISMM '02, Jun. 20-21, 2002. |
Efficient garbage collection schemes for casual message logging with independent checkpointing, Ahn, et al., The Journal of Super Computing; pp. 175-196, 2002. |
Number | Date | Country | |
---|---|---|---|
20110004866 A1 | Jan 2011 | US |