最近对程序占用内存方面做了一些优化取得了不错的效果总结了一些经验
简要说一下相信会对大家写出优质的程序有所帮助
下面的论述针对位系统对位系统不适用后叙经常你写了一个程序一测试功能没问题一看内存占用也不多就不去考虑其它的东西了但可能程序使用了一个什么数据结构会当数据规模变大时内存占用激增
基本&&关键的问题是Java里各种东东占多少内存?
对于primitive类型有个byte short int long float double char boolean 它们的长度分别是
这个不罗嗦了举例来说
long[] data=new long[];
占用内存 * bytes
此外data本身是一个Object也占用内存若干后叙当然它针对 *来说忽略不计再说Object的占用在说这个之前先说说引用一惯的说法是Java里没有指针了只有引用引用是安全的
这个说法没错但是从机理上来说引用就是指针只是jvm对指针的使用检查和限制很多这个引用/指针变得很安全
直接来结论一个引用占byte 在位系统上
Object obj=null; //byte
Object[] objs=new Object[]; //至少*byte
你看我定义了一个 obj还是null就占byte
定义了一个 objs个元素但都是null啊就都每个占byte
虽然obj==null但它已经是 一个引用或者说一个指针了
指针也要占地方
接下来直接给另一个结论 Object占byte注意纯Object
Object obj=new Object(); //多少????
byte?? 错!! byte忘了还有一个引用byte是Object的内容
记住 Object obj=new Object(); 占byte
Object[] objs=new Object[];
for(int i=;i<;i++) {
objs[i]=new Object();
}
至少占用 * bytes
推论 Object占bytes似乎和上面的结论矛盾??!!
没有!! 不管Object没有被垃圾回收之前总得被别人引用吧?总的有指针指它吧? 既然指那个引用or指针就要占地方啊 byte加起来是byte反正一个Object至少 bytes还是直接给结论推导的过程我就都包办了咱不是髒活累活抢着干么!!
一个Integer占 bytes
这时您可能会有疑问Integer=Object+int就是
public class Integer {
public int value;
}
Integer应该占 += bytes啊
你说的有道理但是jvm对所有的Object有限制!这个限制被我发现了就是不管什么Object占的空间要是的倍数不是的倍数只能是了!
推论Byte也占bytes!
问Byte[] bytes=new Byte[];占用空间多少?
答 约为(至少为) (+)* bytes
论题数组空间占用怎么算?
我这里直接给结论了推导这个花了更长的时间对于数组来说数组这个Object有一个length属性数组的元素相当于其成员
public class Array {
public int length;
// 其它成员
}
[] []