java 能知道一个内存对象是多大吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 能知道一个内存对象是多大吗?相关的知识,希望对你有一定的参考价值。

有没有办法算 Integer Double String的对象,分别占多大内存?
Object流 输出一个对象到文本可以吗?

第一问中,integer,Double是可以准确知道大小的
java中int double(包装类分别是Integer和Double,实际是一样的)分别占用的大小是4B 和8B
这里说的B,就是我们通常说的KB中的那个B,全称是Byte。
1B = 8bit。 所以我们通常会说int是32位,有时候又4字节
而String他是有char数组组成,一个长度为10的String,占用的char就是10个,一个char是2B。
所以看String占多少内存,需要知道String的长度

二问中:答案是可以的
摘自ObjectOutPutStream的API说明
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());

oos.close();
参考技术A 第一个问题:不能直接的知道,但是可以间接地知道,Runtime类中一个方法可以知道总大小和剩余大小,你添加一个类然后查看剩余大小不就计算出来了。
第二个问题:Object流 输出一个对象到文本可以吗?这要看你输出对象的什么东西了,如果是属性或者是对象名的话那当然可以了,如果你使用的是System.out.println(object);那当然不可以了,因为对一些常见的对象String Date 会按照相应的格式输出,但是别的因为JVM没有事先知道,所以不知道什么格式,输出的只是引用追问

Runtime类的,我写方法测试的时候,他计算只是引用大小,比如String[] s = new String[1000];你算出来的大小就是4000字节,一个引用是4个字节,但是我每个数组元素里面存的都是20个字节的字符串,却没算出来,结果减出来的光是引用大小,不知道怎么回事,我算的时候就是new之前的一个freeMemory - new 之后的freeMemory

追答

String[] s = new String[1000];是定义了1000个引用啊,没有定义对象啊

for(int i = 0; i < 1000; i++)

s[i] = new String("hello");

追问

对啊,我就是这样算的 s[i] = new String("aaaaaaaaaaaaaaaaaaaaaaaaa");我减出来还是引用的值,里面的字节根本没算

参考技术B 二问,楼上回答了!
一问,太确切的不怎么好知道(至少我不知道),知道个数据的大概大小,比如String占多少之类的。。。还有就是比如String在内存中的引用,标示之类的也要占大小!

C++中一个class类对象占用多少内字节(7个例子,很清楚)

一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?

 

    一个Class对象需要占用多大的内存空间。最权威的结论是: 
*非静态成员变量总合。 
*加上编译器为了CPU计算,作出的数据对齐处理。 
*加上为了支持虚函数,产生的额外负担。

介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论) 


    一、空类的Size

 1 class Car
 2 {
 3 };
 4  
 5 void main()
 6 {
 7     int size = 0;
 8     Car objCar;
 9     size = sizeof(objCar);
10     printf("%s %d /r", "Class Car Size:", size);
11 }
输出结果:Class Car Size:1

这是为何呢?我想对于这个问题,不仅是刚入行不久的开发新手,就算有过几年以上C++开发经验的开发人员也未必能说清楚这个。 
编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。

 

    二、只有成员变量的Size

 1 class Car
 2 {
 3 private:
 4     int nLength;
 5     int nWidth;
 6 };
 7  
 8 void main()
 9 {
10     int size = 0;
11     Car objCar;
12     size = sizeof(objCar);
13     printf("%s %d /r", "Class Car Size:", size);
14 }
输出结果:Class Car Size:8

这个结果很多开发人员都清楚。在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。

 

    三、有静态成员变量的Size

 1 class Car
 2 {
 3 private:
 4     int nLength;
 5     int nWidth;
 6     static int sHigh;
 7 };
 8  
 9 void main()
10 {
11     int size = 0;
12     Car objCar;
13     size = sizeof(objCar);
14     printf("%s %d /r", "Class Car Size:", size);
15 }
输出结果:Class Car Size:8

我们这次在Class Car中添加了一个静态成员变量,但是Class Size仍然是8个字节。这正好符合了,结论中的第一条:非静态成员变量总合。

 

    四、有字符型变量(char)的Size

 1 class Car
 2 {
 3 private:
 4     char chLogo
 5     int nLength;
 6     int nWidth;
 7     static int sHigh;
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:12

在类中又插入了一个字符型变量,结果Class Size变成了12。这个就是编译器额外添加3个字符变量,做数据对齐处理,为了是提高CPU的计算速度。编译器额外添加的东西我们是无法看见的。这也符合了结论中的第二条:加上编译器为了CPU计算,作出的数据对齐处理。 
既然,我们这样定义类成员数据编译器会额外的增加空。那么,我们何不在定义类的时候就考虑到数据对齐的问题,可以多定义出3个字符类型变量作为预留变量,既能满足数据对齐的要求,也给自己的程序添加了一些可扩展的空间。

 

    五、只有成员函数的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     ~Car(){};
 6 public:
 7     void Fun(){};
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:1

噢,这是怎么回事儿呢?再做一个实验看看。

 

    六、有成员函数和成员变量的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     ~Car(){};
 6 public:
 7     void Fun(){};
 8 private:
 9     int nLength;
10     int nWidth;
11 };
12  
13 void main()
14 {
15     int size = 0;
16     Car objCar;
17     size = sizeof(objCar);
18     printf("%s %d /r", "Class Car Size:", size);
19 }
输出结果:Class Car Size:8

这次应该很清楚的了。函数是不占用类空间的。第一个例子中的Size为1个字节,正是编译器为类创建一个隐含的一个字节的空间

 

    七、有虚函数(virtual)的Size

 1 class Car
 2 {
 3 public:
 4     Car(){};
 5     virtual ~Car(){};
 6 public:
 7     void Fun(){};
 8 };
 9  
10 void main()
11 {
12     int size = 0;
13     Car objCar;
14     size = sizeof(objCar);
15     printf("%s %d /r", "Class Car Size:", size);
16 }
输出结果:Class Car Size:4

这次,让析构函数为虚函数,看到了Class Size为4。这正是指向Virtual Table的指针vptr的Size。这正好符合了,结论中的第三条:加上为了支持虚函数,产生的额外负担。

 

http://www.cnblogs.com/findumars/p/7270628.html







以上是关于java 能知道一个内存对象是多大吗?的主要内容,如果未能解决你的问题,请参考以下文章

你的工作未来5年被人工智能替代的概率是多大?看完本文你就知道

电脑内存有736MB算大吗?

本机有JAVA 程序。执行内存大小1048576字节!是啥意思?

一个Java对象到底占多大内存

请帮忙计算,分辨率为640 x 480 ,帧数30fps, VGA 格式的视频,一个小时长度大概是多大呢?

在启动一个winform窗体的时候,实例化多个窗体对象用于跳转页面或其他功能,这样损耗大吗?