Mercurial > hg > graal-compiler
comparison src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp @ 269:850fdf70db2b
Merge
author | jmasa |
---|---|
date | Mon, 28 Jul 2008 15:30:23 -0700 |
parents | d1605aabd0a1 12eea04c8b06 |
children | 81cd571500b0 |
comparison
equal
deleted
inserted
replaced
238:3df2fe7c4451 | 269:850fdf70db2b |
---|---|
714 void reset_chunk(size_t chunk_index); | 714 void reset_chunk(size_t chunk_index); |
715 | 715 |
716 virtual IterationStatus do_addr(HeapWord* addr, size_t words); | 716 virtual IterationStatus do_addr(HeapWord* addr, size_t words); |
717 }; | 717 }; |
718 | 718 |
719 // The UseParallelOldGC collector is a stop-the-world garbage | |
720 // collector that does parts of the collection using parallel threads. | |
721 // The collection includes the tenured generation and the young | |
722 // generation. The permanent generation is collected at the same | |
723 // time as the other two generations but the permanent generation | |
724 // is collect by a single GC thread. The permanent generation is | |
725 // collected serially because of the requirement that during the | |
726 // processing of a klass AAA, any objects reference by AAA must | |
727 // already have been processed. This requirement is enforced by | |
728 // a left (lower address) to right (higher address) sliding compaction. | |
729 // | |
730 // There are four phases of the collection. | |
731 // | |
732 // - marking phase | |
733 // - summary phase | |
734 // - compacting phase | |
735 // - clean up phase | |
736 // | |
737 // Roughly speaking these phases correspond, respectively, to | |
738 // - mark all the live objects | |
739 // - calculate the destination of each object at the end of the collection | |
740 // - move the objects to their destination | |
741 // - update some references and reinitialize some variables | |
742 // | |
743 // These three phases are invoked in PSParallelCompact::invoke_no_policy(). | |
744 // The marking phase is implemented in PSParallelCompact::marking_phase() | |
745 // and does a complete marking of the heap. | |
746 // The summary phase is implemented in PSParallelCompact::summary_phase(). | |
747 // The move and update phase is implemented in PSParallelCompact::compact(). | |
748 // | |
749 // A space that is being collected is divided into chunks and with | |
750 // each chunk is associated an object of type ParallelCompactData. | |
751 // Each chunk is of a fixed size and typically will contain more than | |
752 // 1 object and may have parts of objects at the front and back of the | |
753 // chunk. | |
754 // | |
755 // chunk -----+---------------------+---------- | |
756 // objects covered [ AAA )[ BBB )[ CCC )[ DDD ) | |
757 // | |
758 // The marking phase does a complete marking of all live objects in the | |
759 // heap. The marking also compiles the size of the data for | |
760 // all live objects covered by the chunk. This size includes the | |
761 // part of any live object spanning onto the chunk (part of AAA | |
762 // if it is live) from the front, all live objects contained in the chunk | |
763 // (BBB and/or CCC if they are live), and the part of any live objects | |
764 // covered by the chunk that extends off the chunk (part of DDD if it is | |
765 // live). The marking phase uses multiple GC threads and marking is | |
766 // done in a bit array of type ParMarkBitMap. The marking of the | |
767 // bit map is done atomically as is the accumulation of the size of the | |
768 // live objects covered by a chunk. | |
769 // | |
770 // The summary phase calculates the total live data to the left of | |
771 // each chunk XXX. Based on that total and the bottom of the space, | |
772 // it can calculate the starting location of the live data in XXX. | |
773 // The summary phase calculates for each chunk XXX quantites such as | |
774 // | |
775 // - the amount of live data at the beginning of a chunk from an object | |
776 // entering the chunk. | |
777 // - the location of the first live data on the chunk | |
778 // - a count of the number of chunks receiving live data from XXX. | |
779 // | |
780 // See ParallelCompactData for precise details. The summary phase also | |
781 // calculates the dense prefix for the compaction. The dense prefix | |
782 // is a portion at the beginning of the space that is not moved. The | |
783 // objects in the dense prefix do need to have their object references | |
784 // updated. See method summarize_dense_prefix(). | |
785 // | |
786 // The summary phase is done using 1 GC thread. | |
787 // | |
788 // The compaction phase moves objects to their new location and updates | |
789 // all references in the object. | |
790 // | |
791 // A current exception is that objects that cross a chunk boundary | |
792 // are moved but do not have their references updated. References are | |
793 // not updated because it cannot easily be determined if the klass | |
794 // pointer KKK for the object AAA has been updated. KKK likely resides | |
795 // in a chunk to the left of the chunk containing AAA. These AAA's | |
796 // have there references updated at the end in a clean up phase. | |
797 // See the method PSParallelCompact::update_deferred_objects(). An | |
798 // alternate strategy is being investigated for this deferral of updating. | |
799 // | |
800 // Compaction is done on a chunk basis. A chunk that is ready to be | |
801 // filled is put on a ready list and GC threads take chunk off the list | |
802 // and fill them. A chunk is ready to be filled if it | |
803 // empty of live objects. Such a chunk may have been initially | |
804 // empty (only contained | |
805 // dead objects) or may have had all its live objects copied out already. | |
806 // A chunk that compacts into itself is also ready for filling. The | |
807 // ready list is initially filled with empty chunks and chunks compacting | |
808 // into themselves. There is always at least 1 chunk that can be put on | |
809 // the ready list. The chunks are atomically added and removed from | |
810 // the ready list. | |
811 // | |
719 class PSParallelCompact : AllStatic { | 812 class PSParallelCompact : AllStatic { |
720 public: | 813 public: |
721 // Convenient access to type names. | 814 // Convenient access to type names. |
722 typedef ParMarkBitMap::idx_t idx_t; | 815 typedef ParMarkBitMap::idx_t idx_t; |
723 typedef ParallelCompactData::ChunkData ChunkData; | 816 typedef ParallelCompactData::ChunkData ChunkData; |