92 bool is_null() const { return _holder == NULL; }
93 };
94
95 #ifdef _MSC_VER
96 #pragma warning(pop)
97 #endif
98
99 typedef GenericTaskQueue<G1TaskQueueEntry, mtGC> G1CMTaskQueue;
100 typedef GenericTaskQueueSet<G1CMTaskQueue, mtGC> G1CMTaskQueueSet;
101
102 // Closure used by CM during concurrent reference discovery
103 // and reference processing (during remarking) to determine
104 // if a particular object is alive. It is primarily used
105 // to determine if referents of discovered reference objects
106 // are alive. An instance is also embedded into the
107 // reference processor as the _is_alive_non_header field
108 class G1CMIsAliveClosure : public BoolObjectClosure {
109 G1CollectedHeap* _g1h;
110 public:
111 G1CMIsAliveClosure(G1CollectedHeap* g1h) : _g1h(g1h) { }
112
113 bool do_object_b(oop obj);
114 };
115
116 // Represents the overflow mark stack used by concurrent marking.
117 //
118 // Stores oops in a huge buffer in virtual memory that is always fully committed.
119 // Resizing may only happen during a STW pause when the stack is empty.
120 //
121 // Memory is allocated on a "chunk" basis, i.e. a set of oops. For this, the mark
122 // stack memory is split into evenly sized chunks of oops. Users can only
123 // add or remove entries on that basis.
124 // Chunks are filled in increasing address order. Not completely filled chunks
125 // have a NULL element as a terminating element.
126 //
127 // Every chunk has a header containing a single pointer element used for memory
128 // management. This wastes some space, but is negligible (< .1% with current sizing).
129 //
130 // Memory management is done using a mix of tracking a high water-mark indicating
131 // that all chunks at a lower address are valid chunks, and a singly linked free
132 // list connecting all empty chunks.
|
92 bool is_null() const { return _holder == NULL; }
93 };
94
95 #ifdef _MSC_VER
96 #pragma warning(pop)
97 #endif
98
99 typedef GenericTaskQueue<G1TaskQueueEntry, mtGC> G1CMTaskQueue;
100 typedef GenericTaskQueueSet<G1CMTaskQueue, mtGC> G1CMTaskQueueSet;
101
102 // Closure used by CM during concurrent reference discovery
103 // and reference processing (during remarking) to determine
104 // if a particular object is alive. It is primarily used
105 // to determine if referents of discovered reference objects
106 // are alive. An instance is also embedded into the
107 // reference processor as the _is_alive_non_header field
108 class G1CMIsAliveClosure : public BoolObjectClosure {
109 G1CollectedHeap* _g1h;
110 public:
111 G1CMIsAliveClosure(G1CollectedHeap* g1h) : _g1h(g1h) { }
112 bool do_object_b(oop obj);
113 };
114
115 class G1CMSubjectToDiscoveryClosure : public BoolObjectClosure {
116 G1CollectedHeap* _g1h;
117 public:
118 G1CMSubjectToDiscoveryClosure(G1CollectedHeap* g1h) : _g1h(g1h) { }
119 bool do_object_b(oop obj);
120 };
121
122 // Represents the overflow mark stack used by concurrent marking.
123 //
124 // Stores oops in a huge buffer in virtual memory that is always fully committed.
125 // Resizing may only happen during a STW pause when the stack is empty.
126 //
127 // Memory is allocated on a "chunk" basis, i.e. a set of oops. For this, the mark
128 // stack memory is split into evenly sized chunks of oops. Users can only
129 // add or remove entries on that basis.
130 // Chunks are filled in increasing address order. Not completely filled chunks
131 // have a NULL element as a terminating element.
132 //
133 // Every chunk has a header containing a single pointer element used for memory
134 // management. This wastes some space, but is negligible (< .1% with current sizing).
135 //
136 // Memory management is done using a mix of tracking a high water-mark indicating
137 // that all chunks at a lower address are valid chunks, and a singly linked free
138 // list connecting all empty chunks.
|