欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中new Object()到底占用多少个字节?

程序员文章站 2022-04-04 23:52:19
...

Java Object obj = new Object()到底占用多少个字节?

Java中没有类似C的sizeof的操作符,如何获取一个对象实际占用的字节数呢?

有一种比较方便的方式是通过启动jdk自带的jvisualvm来观察。

先写一个测试类

public class TestObjSize {
	//定义一个直接继承Object的类,用于观察
	public static class TestObject {
	}

	public static void main(String[] args) {
		List<TestObject> list = new ArrayList<TestObject>(1024);
		for(int i=0;i<1000;i++) {
			//创建1000个对象,避免被回收,add到list里面
			list.add(new TestObject());
		}
		try {
			System.in.read();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

编译运行

#编译
javac -encoding utf8 TestObjSize.java
#运行
java TestObjSize

jvisualvm观察

到jdk安装目录bin文件夹下找到jvisualvm.exe启动后,查看1000个TestObject的对象占用多少字节:
Java中new Object()到底占用多少个字节?
可以看到,1000个对象占用了16000个字节,显然1个对象占用16个字节

补充

既然一个Object对象占用16个字节,那这个16个字节中分别存放的是什么内容呢?

  • 前面8个字节是对象头,也叫markword,记录对象被上锁的各种状态(锁升级)和垃圾回收相关信息等。
  • 接下来4个字节(4G堆内存以下;或者32G以内,并且开启了ClassPointer指针压缩,否则是8个字节)是一个指向对象所属Class对象的指针。
  • 接下来4个字节是为了8字节对齐而填充的padding。

查看是否开启指针压缩:

java -XX:+PrintFlagsFinal | find "UseCompressed"
----
bool UseCompressedClassPointers  := true  {lp64_product}
bool UseCompressedOops           := true  {lp64_product}

UseCompressedClassPointers:类对象指针压缩选项。

UseCompressedOops(oops–Ordinary Object Pointers):普通对象指针压缩选项。


相关标签: Java功底