日期:2014-05-20  浏览次数:20883 次

java如何获取对象占用内存大小?
如何获取对象占用多大内存。读了一个11M的文本,分词用HashMap存起来,打印内存居然少了400M,想看看内存被谁占用了

------解决方案--------------------
11M文本,假设每个词占10个字节都有110W个词组左右。
比如key为词组,value为词频,算上java中对象的额外空间,以及hash结构的开销,是不是差不多要几百M。
这个时候选择一个好的数据结构就比较合适了。比如分词使用trie树可以看看会不会达到你要的效果。
------解决方案--------------------
应该是HashMap占用了比较多。一个非常简单的测试方法,在你认为消耗内存的前后打印下当前使用的内存:


import java.util.HashMap;
import java.util.Map;

public class MemoryTest {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub


System.gc();
long total = Runtime.getRuntime().totalMemory(); // byte
long m1 = Runtime.getRuntime().freeMemory();
System.out.println("before:" + (total - m1));

Map<Object,Object> map = new HashMap<Object,Object>();
for(int i=0; i < 100; i++){
map.put(new Object(), new Object());
}
long total1 = Runtime.getRuntime().totalMemory();
long m2 = Runtime.getRuntime().freeMemory();
System.out.println("after:" + (total1 - m2));
System.out.println(map.toString());
}

}



打印结果:
before:494872
after:825272
{java.lang.Object@41fae3c6=java.lang.Object@6727734f, java.lang.Object@4506411=java.lang.Object@4f037c71, java.lang.Object@39d99a4d=java.lang.Object@6ddf073d, java.lang.Object@95c7850=java.lang.Object@4d546e25, java.lang.Object@37dd7056=java.lang.Object@620b66cc, java.lang.Object@1f24bbbf=java.lang.Object@5a8a0d5d, java.lang.Object@6ac2a132=java.lang.Object@1d73831b, java.lang.Object@44fd13b5=java.lang.Object@aa470b8, java.lang.Object@6a8814e9=java.lang.Object@31e4457d, java.lang.Object@41d5550d=java.lang.Object@18e2b22, java.lang.Object@2687816d=java.lang.Object@1cb1c5fa, java.lang.Object@16c9ba38=java.lang.Object@5b3caecd, java.lang.Object@8dd20f6=java.lang.Object@6cf84386, java.lang.Object@229ed927=java.lang.Object@1f194a4e, java.lang.Object@7bdecdec=java.lang.Object@355d56d5, java.lang.Object@4318f375=java.lang.Object@2efd552, java.lang.Object@7000a32b=java.lang.Object@4f9dfbff, java.lang.Object@27430b5c=java.lang.Object@d0b4b2f, java.lang.Object@5456a499=java.lang.Object@60750159, java.lang.Object@4310b053=java.lang.Object@21abab88, java.lang.Object@1ff9dc36=java.lang.Object@d8a7efd, java.lang.Object@6d9efb05=java.lang.Object@7f971afc, java.lang.Object@55e859c0=java.lang.Object@196cd7d5, java.lang.Object@7ca83b8a=java.lang.Object@38cdedfd, java.lang.Object@13aaa14a=java.lang.Object@57c39a2d, java.lang.Object@3d4b7453=java.lang.Object@6abf2d5e, java.lang.Object@26021b6d=java.lang.Object@2d3bad12, java.lang.Object@3d833955=java.lang.Object@28df8ff1, java.lang.Object@40a0dcd9=java.lang.Object@6d632c2d, java.lang.Object@5b86d4c1=java.lang.Object@9e97676, java.lang.Object@2b820dda=java.lang.Object@3e60420f, java.lang.Object@2da679b7=java.lang.Object@219106c7, java.lang.Object@ce102dc=java.lang.Object@38540408, java.lang.Object@7d2152e6=java.lang.Object@13d4c61c, java.lang.Object@3a3ee284=java.lang.Object@761a626f, java.lang.Object@5013582d=java.lang.Object@3e34a1fc, java.lang.Object@59de3f2d=java.lang.Object@7176c74b, java.lang.Object@4383f74d=java.lang.Object@2d16471f, java.lang.Object@7f5f5897=java.lang.Object@11975b59, java.lang.Object@2fe4cbc4=java.lang.Object@67ee3914, java.lang.Object@7d67d940=java.lang.Object@48e5855a, java.lang.Object@6c22c95b=java.lang.Object@5495fd19, java.lang.Object@11cfb549=java.lang.Object@431b9fb1, java.lang.Object@2586db54=java.lang.Object@4a913fe2, java.lang.Object@68ab95e6=java.lang.Object@5f934ad, java.lang.Object@7b11a3ac=java.lang.Object@2bf14ceb, java.lang.Object@50337d0f=java.lang.Object@6ef0eed6, java.lang.Object@4cb162d5=java.lang.Object@bd05c81, java.lang.Object@eb166b5=java.lang.Object@1c691f36, java.lang.Object@3e7ffe01=java.lang.Object@398020cc, java.lang.Object@5e743399=java.lang.Object@ae94e92, java.lang.Object@20cdfc9c=java.lang.Object@5b2558d6, java.lang.Object@15ded0fd=java.lang.Object@70eb7859, java.lang.Object@c1503a3=java.lang.Object@732a54f9, java.lang.Object@37a1c887=java.lang.Object@6030e280, java.lang.Object@2afa3ac1=java.lang.Object@296672d6, java.lang.Object@1034bb5=java.lang.Object@4fd54d6, java.lang.Object@882c01f=java.lang.Object@13ccb029, java.lang.Object@8b2fd8f=java.lang.Object@63415de6, java.lang.Object@3f0ef90c=java.lang.Object@587bd9f2, java.lang.Object@576a9d42=java.lang.Object@2b21cc40, java.lang.Object@12276af2=java.lang.Object@37e893df, java.lang.Object@60a1807c=java.lang.Object@6443226, java.lang.Object@768965fb=java.lang.Object@67386000, java.lang.Object@e05d173=java.lang.Object@2626d4f1, java.lang.Object@1ee7b241=java.lang.Object@3f662dc8, java.lang.Object@c80f4cb=java.lang.Object@4d47c5fc, java.lang.Object@64578ceb=java.lang.Object@23174b07, java.lang.Object@15e0be38=java.lang.Object@4e3eca90, java.lang.Object@664741d6=java.lang.Object@7c64dc11, java.lang.Object@70f9f9d8=java.lang.Object@41ac1fe4, java.lang.Object@1b17a8bd=java.lang.Object@b61d36b, java.lang.Object@72291aff=java.lang.Object@437f1ba3, java.lang.Object@7f12f614=java.lang.Object@4def8cf3, java.lang.Object@afa7e74=java.lang.Object@2a0ecd7e, java.lang.Object@39d8957f=java.lang.Object@31d520c4, java.lang.Object@35d9dc39=java.lang.Object@1f5a3d6b, java.lang.Object@38a97b0b=java.lang.Object@5d764be1, java.lang.Object@4ce86da0=java.lang.Object@16fd0b7, java.lang.Object@33837697=java.lang.Object@53ef9f1d, java.lang.Object@3cb89838=java.lang.Object@18b753f8, java.lang.Object@2e471e30=java.lang.Object@2be9cb75, java.lang.Object@5fd1acd3=java.lang.Object@22c84d9, java.lang.Object@2ce83912=java.lang.Object@38c5c3ac, java.lang.Object@58fe64b9=java.lang.Object@3fb16e52, java.lang.Object@3ea981ca=java.lang.Object@19c1ea29, java.lang.Object@24c21495=java.lang.Object@9f436f5, java.lang.Object@187a84e4=java.lang.Object@4413ee, java.lang.Object@60723d7c=java.lang.Object@75786e64, java.lang.Object@a422ede=java.lang.Object@3597a37c, java.lang.Object@40133796=java.lang.Object@766e3d60, java.lang.Object@72093dcd=java.lang.Object@3f7fa65e, java.lang.Object@1cc2ea3f=java.lang.Object@558385e3, java.lang.Object@675b7986=java.lang.Object@2dcb25f1, java.lang.Object@36867e89=java.lang.Object@742808b3, java.lang.Object@55fdc96c=java.lang.Object@70535b58, java.lang.Object@2f754ad2=java.lang.Object@70922804, java.lang.Object@7ecd2c3c=java.lang.Object@b815859, java.lang.Object@79616c7=java.lang.Object@58cf40f5, java.lang.Object@fe51060=java.lang.Object@eb1c260}