算法分析-估算内存使用

估算内存使用

分析内存使用比分析程序所需运行时间要简单的多,因为涉及程序的声明语句且在分析中会将复杂对象简化为原始数据类型。

在java实现中,8位表示字节,2字节(16位)表示char值,4字节(32位)表示一个int值,8字节(64位)表示一个double或者long值。使用1字节表示boolean值。

许多数据结果都涉及对机器地址的表示,现在广泛使用64位架构中表示机器地址需要8个字节,老式32位架构中只是用4个字节表示机器地址

对象:估算对象的内存量需要将所有实例变量使用的内存与对象本身的开销(一般是16字节,包括一个指向对象的类的引用、垃圾收集信息以及同步信息)相加。另外,一般内存的使用会被填充为8字节(64位计算机中的机器字)的倍数。例如,一个Integer对象会使用24个字节。

数组:Java中数组别实现为对象,他们一般都会因为记录长度而需要额外内存。

一个原始数据类型的数组需要24字节的头信息(16字节对象开销,4字节长度信息,4字节填充)再加上保存值所需的内存,最后再被填充为8的倍数;

一个对象数组就是一个对象引用数组,24字节头信息,加上保存对象所需内存,还有对象引用地址占用的内存。

一个二维数组是数组的数组(每个数组都是一个对象)

字符串对象:String的标准实现含有4个实例变量:一个指向字符数组的引用value,三个int值(第一个描述偏移量offset,第二个是字符串长度计数器count,第三个是一个散列值)。字符串对象所表示的字符串由value[offset]到value[offset+count-1]中字符组成。

字符数组所需空间需要另算,String的char数组常常在多个字符串之间共享。当调用substring()方法时,创建了一个新的String对象,它会重用了字符数组,所以该字符串的子字符串对象只会使用40字节内存(16+8+4*3)。

以上可以估计大量程序对内存的使用情况,许多复杂因素仍会使任务变得困难。当设计函数调用时,内存的消耗就变成了一个动态的问题。调用一个方法时,Java系统分配栈内存保存局部变量;方法返回时,占用栈内存返还给系统。当使用new创建对象,系统会从堆内存为对象分配所需内存。

原文地址:https://www.cnblogs.com/xiejinjie/p/10001905.html