java中用byte[]数组实现的队列和用Byte[]实现的队列实际占用空间对比
我用byte[]实现了一个队列,创建对象,也用ArrayBlockingQueue<Byte>创建对象,添加10M个byte/Byte后通过对象流输出到文件,文件的大小可以代表对象的大小,一探java装箱额外占用空间的大小。
测试代码:
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Queue; import java.util.Scanner; import java.util.concurrent.ArrayBlockingQueue; import com.idealisan.structure.ArrayBlockingByteValueQueue; public class TestMen { static int capacity = 1024 * 1024 * 10; public static void main(String[] args) { ArrayBlockingQueue<Byte> pointerQueue = new ArrayBlockingQueue<Byte>(capacity); ArrayBlockingByteValueQueue valueQueue = new ArrayBlockingByteValueQueue(capacity); fillQueue(valueQueue); FileOutputStream os; try { os = new FileOutputStream(new File("F:/ttt/value10.dat")); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(valueQueue); oos.flush(); oos.close(); os.flush(); os.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } valueQueue = null; fillQueue(pointerQueue); try { os = new FileOutputStream(new File("F:/ttt/pointer10.dat")); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(pointerQueue); oos.flush(); oos.close(); os.flush(); os.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } pointerQueue = null; } private static void fillQueue(Queue<Byte> queue) { while (queue.size() < capacity) { queue.offer(new Byte((byte) 1)); } } }
最后的结果是装箱的Byte多使用了600%的空间,当然,一般不会有10M个对象那么多,也很少会让每个字节成为一个单独的对象,太浪费空间了。其中值类型的byte也额外使用了大约1kB的空间,应该是用于存放容器对象的信息。