如何估算一个image对象在jvm中占用的内存大小?
自制了一个测试程序,但是运行的数据结果感觉无法解释。
程序代码:
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;public class ImageUtils {public static String imgfile = "d:\\1.jpg";
public static Image loadImage(String file){
Image img = null;
try{
img = ImageIO.read(new File(file));
}catch(Exception e){
e.printStackTrace();
}
return img;
}

public static void main(String args[]) throws Exception{ int tot = 50;
if(args.length == 1){
tot = Integer.parseInt(args[0]);
}else if(args.length == 2){
tot = Integer.parseInt(args[0]);
imgfile = args[1];
}

testmemory(tot);
}

public static void testmemory(int to) throws Exception { System.gc();
Runtime rt = Runtime.getRuntime(); long idleMem = rt.freeMemory();
long LastidleMem = idleMem;
System.out.println("now jvm idle memory is " + idleMem);

Image img1 = loadImage(imgfile);

idleMem = rt.freeMemory();
System.out.println("after load one image the jvm idle memory is " + idleMem + ", using " + (LastidleMem - idleMem));
//a = stin.readLine();
Image[] imgs = new Image[to];
System.gc();
Thread.sleep(10000);
idleMem = rt.freeMemory();
LastidleMem = idleMem;
System.out.println("load " + to +" img " + idleMem);
for(int i = 0; i < to; i++){
imgs[i] = loadImage(imgfile);
}
idleMem = rt.freeMemory();
System.out.println("after load " + to + " img idle memory is " + idleMem + ", using " + (LastidleMem - idleMem));
System.out.println("avrage is " + ((LastidleMem - idleMem) / to));

for(int i = 0; i < to; i++){
System.out.print(imgs[i].toString());
} }
}
不同的参数运行结果也不同
D:\java\test jvm memory>java ImageUtils 60 d:/3.jpg
now jvm idle memory is 15809552
after load one image the jvm idle memory is 14714936, using 1094616
load 60 img 15367936
after load 60 img idle memory is 946352, using 14421584
avrage is 240359D:\java\test jvm memory>java ImageUtils 20 d:/3.jpg
now jvm idle memory is 15809552
after load one image the jvm idle memory is 14714936, using 1094616
load 20 img 15368128
after load 20 img idle memory is 7514096, using 7854032
avrage is 392701D:\java\test jvm memory>java ImageUtils 10 d:/3.jpg
now jvm idle memory is 15809552
after load one image the jvm idle memory is 14714936, using 1094616
load 10 img 15368168
after load 10 img idle memory is 10347544, using 5020624
avrage is 502062D:\java\test jvm memory>java ImageUtils 60
now jvm idle memory is 15809632
after load one image the jvm idle memory is 14715104, using 1094528
load 60 img 15368016
after load 60 img idle memory is 926040, using 14441976
avrage is 240699上述测试使用的图片都是283 * 420分辨率的jpg图片。
可见在图片大小同样的情况下,测试的数据主要是受加载对象数的多少影响。
为何会出现这种对象占用内存大小测试结果不同的情况呢?java 内存 image

解决方案 »

  1.   

    更有意思的是,我还测试出负值来了,如下
    D:\java\test jvm memory>java ImageUtils 70
    now jvm idle memory is 15809344
    after load one image the jvm idle memory is 14714816, using 1094528
    load 70 img 15367720
    after load 70 img idle memory is 22494896, using -7127176
    avrage is -101816D:\java\test jvm memory>java ImageUtils 80
    now jvm idle memory is 15809344
    after load one image the jvm idle memory is 14714816, using 1094528
    load 80 img 15367680
    after load 80 img idle memory is 22146864, using -6779184
    avrage is -84739D:\java\test jvm memory>java ImageUtils 100
    now jvm idle memory is 15809336
    after load one image the jvm idle memory is 14714808, using 1094528
    load 100 img 15367592
    after load 100 img idle memory is 14855376, using 512216
    avrage is 5122D:\java\test jvm memory>java ImageUtils 200
    now jvm idle memory is 15809336
    after load one image the jvm idle memory is 14714808, using 1094528
    load 200 img 15367192
    after load 200 img idle memory is 24399320, using -9032128
    avrage is -45160
      

  2.   

    负值?应该是你内存的算法错了吧,java的内存可不是这么简单算出来的