comparison src/share/vm/oops/objArrayOop.hpp @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1 37f87013dfd8
comparison
equal deleted inserted replaced
110:a49a647afe9a 113:ba764ed4b6f2
24 24
25 // An objArrayOop is an array containing oops. 25 // An objArrayOop is an array containing oops.
26 // Evaluating "String arg[10]" will create an objArrayOop. 26 // Evaluating "String arg[10]" will create an objArrayOop.
27 27
28 class objArrayOopDesc : public arrayOopDesc { 28 class objArrayOopDesc : public arrayOopDesc {
29 friend class objArrayKlass;
30 friend class Runtime1;
31 friend class psPromotionManager;
32
33 template <class T> T* obj_at_addr(int index) const {
34 assert(is_within_bounds(index), "index out of bounds");
35 return &((T*)base())[index];
36 }
37
29 public: 38 public:
39 // base is the address following the header.
40 HeapWord* base() const { return (HeapWord*) arrayOopDesc::base(T_OBJECT); }
41
30 // Accessing 42 // Accessing
31 oop obj_at(int index) const { return *obj_at_addr(index); } 43 oop obj_at(int index) const {
32 void obj_at_put(int index, oop value) { oop_store(obj_at_addr(index), value); } 44 // With UseCompressedOops decode the narrow oop in the objArray to an
33 oop* base() const { return (oop*) arrayOopDesc::base(T_OBJECT); } 45 // uncompressed oop. Otherwise this is simply a "*" operator.
46 if (UseCompressedOops) {
47 return load_decode_heap_oop(obj_at_addr<narrowOop>(index));
48 } else {
49 return load_decode_heap_oop(obj_at_addr<oop>(index));
50 }
51 }
34 52
53 void obj_at_put(int index, oop value) {
54 if (UseCompressedOops) {
55 oop_store(obj_at_addr<narrowOop>(index), value);
56 } else {
57 oop_store(obj_at_addr<oop>(index), value);
58 }
59 }
35 // Sizing 60 // Sizing
36 static int header_size() { return arrayOopDesc::header_size(T_OBJECT); } 61 static int header_size() { return arrayOopDesc::header_size(T_OBJECT); }
37 static int object_size(int length) { return align_object_size(header_size() + length); } 62 int object_size() { return object_size(length()); }
38 int object_size() { return object_size(length()); } 63 int array_size() { return array_size(length()); }
39 64
40 // Returns the address of the index'th element 65 static int object_size(int length) {
41 oop* obj_at_addr(int index) const { 66 // This returns the object size in HeapWords.
42 assert(is_within_bounds(index), "index out of bounds"); 67 return align_object_size(header_size() + array_size(length));
43 return &base()[index];
44 } 68 }
69
70 // Give size of objArrayOop in HeapWords minus the header
71 static int array_size(int length) {
72 // Without UseCompressedOops, this is simply:
73 // oop->length() * HeapWordsPerOop;
74 // With narrowOops, HeapWordsPerOop is 1/2 or equal 0 as an integer.
75 // The oop elements are aligned up to wordSize
76 const int HeapWordsPerOop = heapOopSize/HeapWordSize;
77 if (HeapWordsPerOop > 0) {
78 return length * HeapWordsPerOop;
79 } else {
80 const int OopsPerHeapWord = HeapWordSize/heapOopSize;
81 int word_len = align_size_up(length, OopsPerHeapWord)/OopsPerHeapWord;
82 return word_len;
83 }
84 }
85
86 // special iterators for index ranges, returns size of object
87 #define ObjArrayOop_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
88 int oop_iterate_range(OopClosureType* blk, int start, int end);
89
90 ALL_OOP_OOP_ITERATE_CLOSURES_1(ObjArrayOop_OOP_ITERATE_DECL)
91 ALL_OOP_OOP_ITERATE_CLOSURES_3(ObjArrayOop_OOP_ITERATE_DECL)
45 }; 92 };