src/share/vm/memory/space.hpp

Print this page
rev 7084 : [mq]: demacro

*** 44,53 **** --- 44,54 ---- // Here's the Space hierarchy: // // - Space -- an abstract base class describing a heap area // - CompactibleSpace -- a space supporting compaction // - CompactibleFreeListSpace -- (used for CMS generation) + // - G1OffsetTableContigSpace -- G1 version of OffsetTableContigSpace // - ContiguousSpace -- a compactible space in which all free space // is contiguous // - EdenSpace -- contiguous space used as nursery // - ConcEdenSpace -- contiguous space with a 'soft end safe' allocation // - OffsetTableContigSpace -- contiguous space with a block offset array
*** 389,399 **** // which we are currently compacting. This call updates "cp" as necessary, // and leaves the "compaction_top" of the final value of // "cp->compaction_space" up-to-date. Offset tables may be updated in // this phase as if the final copy had occurred; if so, "cp->threshold" // indicates when the next such action should be taken. ! virtual void prepare_for_compaction(CompactPoint* cp); // MarkSweep support phase3 virtual void adjust_pointers(); // MarkSweep support phase4 virtual void compact(); --- 390,400 ---- // which we are currently compacting. This call updates "cp" as necessary, // and leaves the "compaction_top" of the final value of // "cp->compaction_space" up-to-date. Offset tables may be updated in // this phase as if the final copy had occurred; if so, "cp->threshold" // indicates when the next such action should be taken. ! virtual void prepare_for_compaction(CompactPoint* cp) = 0; // MarkSweep support phase3 virtual void adjust_pointers(); // MarkSweep support phase4 virtual void compact();
*** 424,433 **** --- 425,449 ---- HeapWord* compact_top); // Return a size with adjustments as required of the space. virtual size_t adjust_object_size_v(size_t size) const { return size; } + // Functions for scan_and_{forward,adjust_pointers,compact} support. + inline bool scanned_block_is_obj(const HeapWord* addr) const { + // Perform virtual call. This is currently not a problem since this + // function is only used in an assert (from scan_and_adjust_pointers). + return block_is_obj(addr); + } + + inline size_t adjust_obj_size(size_t size) const { + return size; + } + + inline size_t obj_size(const HeapWord* addr) const { + return oop(addr)->size(); + } + protected: // Used during compaction. HeapWord* _first_dead; HeapWord* _end_of_live;
*** 448,457 **** --- 464,492 ---- // iff the free region was made deadspace, and modifies // "allowed_deadspace_words" to reflect the number of available deadspace // words remaining after this operation. bool insert_deadspace(size_t& allowed_deadspace_words, HeapWord* q, size_t word_len); + + // Below are template functions for scan_and_* algorithms (avoiding virtual calls). + // The space argument should be a subclass of CompactibleSpace, implementing + // scan_limit(), scanned_block_is_obj(), and scanned_block_size(), + // and possibly also overriding obj_size(), and adjust_obj_size(). + // These functions should avoid virtual calls whenever possible. + + // Frequently calls adjust_obj_size(). (Asserts on scanned_block_is_obj().) + template <class SpaceType> + static inline void scan_and_adjust_pointers(SpaceType* space); + + // Frequently calls obj_size(). + template <class SpaceType> + static inline void scan_and_compact(SpaceType* space); + + // Frequently calls scanned_block_is_obj() and scanned_block_size(). + // Requires the scan_limit() function. + template <class SpaceType> + static inline void scan_and_forward(SpaceType* space, CompactPoint* cp); }; class GenSpaceMangler; // A space in which the free area is contiguous. It therefore supports
*** 622,631 **** --- 657,678 ---- // Used to increase collection frequency. "factor" of 0 means entire // space. void allocate_temporary_filler(int factor); + // Functions for scan_and_{forward,adjust_pointers,compact} support. + inline HeapWord* scan_limit() const { + return top(); + } + + inline bool scanned_block_is_obj(const HeapWord* addr) const { + return true; // Always true, since scan_limit is top + } + + inline size_t scanned_block_size(const HeapWord* addr) const { + return oop(addr)->size(); + } }; // A dirty card to oop closure that does filtering. // It knows how to filter out objects that are outside of the _boundary.