OK, đã có rất nhiều cuộc thảo luận và không nhiều mã :)
Đây là điểm chuẩn nhanh.Nó có những lời khuyên bình thường khi nói đến loại điều này - kiểm tra bộ nhớ có những điều kỳ quặc do JITting vv, nhưng với số lượng lớn phù hợp nó có ích anyway. Nó có hai loại, mỗi loại có 80 thành viên - LotsOfBytes có 80 byte, LotsOfInts có 80 ints. Chúng tôi xây dựng rất nhiều trong số họ, chắc chắn họ không GC'd, và kiểm tra sử dụng bộ nhớ:
class LotsOfBytes
{
byte a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
byte b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
byte c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
byte d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
byte e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
class LotsOfInts
{
int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
public class Test
{
private static final int SIZE = 1000000;
public static void main(String[] args) throws Exception
{
LotsOfBytes[] first = new LotsOfBytes[SIZE];
LotsOfInts[] second = new LotsOfInts[SIZE];
System.gc();
long startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
first[i] = new LotsOfBytes();
}
System.gc();
long endMem = getMemory();
System.out.println ("Size for LotsOfBytes: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem)/((double)SIZE)));
System.gc();
startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
second[i] = new LotsOfInts();
}
System.gc();
endMem = getMemory();
System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem)/((double)SIZE)));
// Make sure nothing gets collected
long total = 0;
for (int i=0; i < SIZE; i++)
{
total += first[i].a0 + second[i].a0;
}
System.out.println(total);
}
private static long getMemory()
{
Runtime runtime = Runtime.getRuntime();
return runtime.totalMemory() - runtime.freeMemory();
}
}
Output trên hộp của tôi:
Size for LotsOfBytes: 88811688
Average size: 88.811688
Size for LotsOfInts: 327076360
Average size: 327.07636
0
Vì vậy, rõ ràng là có một số chi phí - 8 byte bởi ngoại hình của nó, mặc dù bằng cách nào đó chỉ có 7 cho LotsOfInts (như tôi đã nói, có những điều kỳ quặc ở đây) - nhưng điểm là các trường byte xuất hiện để được đóng gói trong LotsOfBytes như vậy mà phải mất (sau khi loại bỏ trên cao) chỉ một phần tư nhiều bộ nhớ như LotsOfInts.
một byte đơn mất 4/8 byte tùy thuộc vào kiến trúc cpu, byte trong byte [] lấy chính xác một byte + tiêu đề đối tượng (+ theo chiều dọc) – bestsss
"* Tôi biết bạn có thể lưu trữ không quá +127 trong một byte java *" - Không đúng, theo nghĩa nào đó. Bạn có thể lưu trữ 256 giá trị khác nhau trong một byte, do đó bạn ** có thể ** lưu trữ cách hơn 127 trong nó: lên đến 255 nếu bạn bắt đầu từ 0. Tất cả phụ thuộc vào cách bạn xử lý những 8 bit đó. Chỉ vì lợi ích của người đi bộ: P –