00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 class NewWaterMark : ValueObj {
00028 public:
00029 oop* _point;
00030
00031 };
00032
00033 inline bool operator==(const NewWaterMark& x, const NewWaterMark& y) {
00034 return x._point == y._point;
00035 }
00036
00037 inline bool operator!=(const NewWaterMark& x, const NewWaterMark& y) {
00038 return !(x == y);
00039 }
00040
00041 class OldWaterMark : ValueObj {
00042 public:
00043 oldSpace* _space;
00044 oop* _point;
00045 oop* pseudo_allocate(int size);
00046 };
00047
00048 inline bool operator==(const OldWaterMark& x, const OldWaterMark& y) {
00049 return (x._space == y._space) && (x._point == y._point);
00050 }
00051 inline bool operator!=(const OldWaterMark& x, const OldWaterMark& y) {
00052 return !(x == y);
00053 }
00054
00055 class space: public CHeapObj {
00056 private:
00057
00058 char* _name;
00059
00060 public:
00061
00062
00063 virtual oop* bottom() = 0;
00064 virtual oop* top() = 0;
00065 virtual oop* end() = 0;
00066
00067 char* name() const { return _name; }
00068 void set_name(char* name) { _name = name; }
00069
00070 protected:
00071 virtual void set_bottom(oop* value) = 0;
00072 virtual void set_top(oop* value) = 0;
00073 virtual void set_end(oop* value) = 0;
00074
00075 public:
00076 void initialize(char* name, oop* bottom, oop* end);
00077 void clear();
00078
00079 public:
00080 bool is_empty() { return used() == 0; }
00081 int capacity() { return byte_size(bottom(), end()); }
00082 int used() { return byte_size(bottom(), top()); }
00083 int free() { return byte_size(top(), end()); }
00084
00085
00086
00087 void prepare_for_compaction(OldWaterMark* mark);
00088
00089 void compact(OldWaterMark* mark);
00090
00091 protected:
00092
00093 virtual void verify() = 0;
00094
00095
00096 void oops_do(oopsDoFn f);
00097
00098 public:
00099 void switch_pointers(oop from, oop to);
00100 void print();
00101 void object_iterate(ObjectClosure* blk);
00102 };
00103
00104 class newSpace: public space {
00105 public:
00106 newSpace* next_space;
00107
00108 public:
00109 oop* object_start(oop* p);
00110 void verify();
00111
00112 void object_iterate_from(NewWaterMark* mark, ObjectClosure* blk);
00113
00114 NewWaterMark top_mark() {
00115 NewWaterMark m;
00116 m._point = top();
00117 return m;
00118 }
00119 };
00120
00121 extern "C" oop* eden_bottom;
00122 extern "C" oop* eden_top;
00123 extern "C" oop* eden_end;
00124
00125 class edenSpace : public newSpace {
00126 public:
00127 oop* bottom() { return eden_bottom; }
00128 oop* top() { return eden_top; }
00129 oop* end() { return eden_end; }
00130
00131 bool contains(void* p) { return (oop*) p >= eden_bottom && (oop*) p < eden_top; }
00132
00133 protected:
00134 void set_bottom(oop* value) { eden_bottom = value; }
00135 void set_top(oop* value) { eden_top = value; }
00136 void set_end(oop* value) { eden_end = value; }
00137
00138 public:
00139
00140 edenSpace();
00141
00142
00143 oop* allocate(int size) {
00144 oop* oops = eden_top;
00145 oop* oops_end = oops + size;
00146 if (oops_end <= eden_end) {
00147 eden_top = oops_end;
00148 return oops;
00149 } else {
00150 return NULL;
00151 }
00152 }
00153 };
00154
00155 class survivorSpace : public newSpace {
00156 private:
00157 oop* _bottom;
00158 oop* _top;
00159 oop* _end;
00160
00161 public:
00162 oop* bottom() { return _bottom; }
00163 oop* top() { return _top; }
00164 oop* end() { return _end; }
00165
00166 bool contains(void* p) { return (oop*) p >= _bottom && (oop*) p < _top; }
00167
00168 protected:
00169 void set_bottom(oop* value) { _bottom = value; }
00170 void set_top(oop* value) { _top = value; }
00171 void set_end(oop* value) { _end = value; }
00172
00173 public:
00174
00175 survivorSpace();
00176
00177
00178 oop* allocate(int size) {
00179 oop* oops = _top;
00180 oop* oops_end = oops + size;
00181 if (oops_end <= _end) {
00182 _top = oops_end;
00183 return oops;
00184 } else {
00185 return NULL;
00186 }
00187 }
00188
00189
00190 bool would_fit(int size) { return _top + size < _end; }
00191
00192
00193 void scavenge_contents_from(NewWaterMark* mark);
00194 };
00195
00196 class oldSpace: public space {
00197 friend class space;
00198 private:
00199 oop* _bottom;
00200 oop* _top;
00201 oop* _end;
00202 public:
00203 oop* bottom() { return _bottom; }
00204 oop* top() { return _top; }
00205 oop* end() { return _end; }
00206
00207 bool contains(void* p) { return (oop*) p >= _bottom && (oop*) p < _top; }
00208
00209 protected:
00210 void set_bottom(oop* value) { _bottom = value; }
00211 void set_top(oop* value) { _top = value; }
00212 void set_end(oop* value) { _end = value; }
00213
00214 public:
00215 void initialize_threshold();
00216 inline void update_offsets(oop* begin, oop* end) {
00217 if (end >= next_offset_treshold) update_offset_array(begin, end);
00218 }
00219 public:
00220 oldSpace* next_space;
00221
00222 oop* object_start(oop* p);
00223
00224 void update_offset_array(oop* p, oop* p_end);
00225
00226 oop* expand_and_allocate(int size);
00227
00228
00229 u_char* offset_array;
00230 oop* next_offset_treshold;
00231 int next_offset_index;
00232
00233 oop* allocate(int size) {
00234 oop* p = _top;
00235 oop* p1 = p + size;
00236 if (p1 < _end) {
00237 _top = p1;
00238 update_offsets(p, p1);
00239 return p;
00240 } else {
00241 return expand_and_allocate(size);
00242 }
00243 }
00244
00245
00246
00247 oldSpace(char* nm, int &size);
00248
00249 void scavenge_contents_from(OldWaterMark* mark);
00250 void object_iterate_from(OldWaterMark* mark, ObjectClosure* blk);
00251
00252 void scavenge_recorded_stores();
00253
00254 void verify();
00255
00256 OldWaterMark top_mark() {
00257 OldWaterMark m;
00258 m._space = this;
00259 m._point = _top;
00260 return m;
00261 }
00262
00263 OldWaterMark bottom_mark() {
00264 OldWaterMark m;
00265 m._space = this;
00266 m._point = _bottom;
00267 return m;
00268 }
00269 };
00270