最近在开发的项目,实体类中的属性用的都是包装类,第一感觉是这样会不会浪费内存?毕竟包装类和基本类型还是有区别的,于是做了一个测试,写了两个类,两个类的属性都一样,只不过一个用的是基本类型,一个用的是包装类(注:此时用的是长整形),两个类的定义如下:
class EntityWrapper{
private Long a;
private Long b;
private Long c;
private Long d;
private Long e;
private Long f;
public Long getA() {
return a;
}
public void setA(Long a) {
this.a = a;
}
public Long getB() {
return b;
}
public void setB(Long b) {
this.b = b;
}
public Long getC() {
return c;
}
public void setC(Long c) {
this.c = c;
}
public Long getD() {
return d;
}
public void setD(Long d) {
this.d = d;
}
public Long getE() {
return e;
}
public void setE(Long e) {
this.e = e;
}
public Long getF() {
return f;
}
public void setF(Long f) {
this.f = f;
}
}
class EntityBasic{
private long a;
private long b;
private long c;
private long d;
private long e;
public long getA() {
return a;
}
public void setA(long a) {
this.a = a;
}
public long getB() {
return b;
}
public void setB(long b) {
this.b = b;
}
public long getC() {
return c;
}
public void setC(long c) {
this.c = c;
}
public long getD() {
return d;
}
public void setD(long d) {
this.d = d;
}
public long getE() {
return e;
}
public void setE(long e) {
this.e = e;
}
public long getF() {
return f;
}
public void setF(long f) {
this.f = f;
}
private long f;
}
然后main方法中像下面这样写:
List<EntityBasic> list = new ArrayList<EntityBasic>();
int i=0;
while(i<Integer.MAX_VALUE){
System.out.println(i++);
EntityBasic e = new EntityBasic();
list.add(e);
}
把JVM堆内存调到8M(-Xms8M -Xmx8M),由于list中保持强引用,所以很快就会OOM了,这样就可以知道创建了多少对象,然而结果着实令我吃了一鲸,基本类型那个类创建了88147个对象就OOM了,包装类那个类创建了135724个对象才OOM,和我想的完全不一样,究竟是哪出了问题呢?于是乎百度了一下(别问我为什么不谷歌,太胖,翻不了墙),找到如下两篇文章1:http://sunqi.iteye.com/blog/1917802 2:http://blog.sina.com.cn/s/blog_605f5b4f0100toc5.html
然后又回想了一下Java中一个对象创建的过程,瞬间恍然大误(没错,就是误),在仅仅考虑堆内存的情况下,基本类型的内存使用是没有问题的,问题就在于包装类,无论是哪种基本类型的包装类(当然,包含但不限于包装类)对象,在作为另一个类中的属性的时候,保存的仅仅是一个引用,而这个引用不分类型,都是4字节的,所Long类型的对象的引用是4字节,而long类型却占用了8字节,所以这时就会出现属性类型是基本类型的类的对象占用的内存比属性类型是包装类的类的对象多的情况,如果将上面两个实体类中的属性类型改为Byte和byte,创建对象的个数分别变为了135734和218410,使用基本类型的类明显创建的对象数变多了,而当属性类型换做Integer和int时两个类在同等情况下创建的对象数都为135731,果然,还是实践出真知,凭空想是没什么卵用的。