/***************************************************
* TODO: description .
* @author: gao_chun
* @since: 2015-4-2
* @version: 1.0.0
* @remark: 转载请注明出处
**************************************************/
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况。
也许很多人都没有考虑过这个问题,new一个Object对象到底占用多少内存呢( Object obj = new Object() ) ?那么分配的空间有多大,存储了什么内容呢?我在JVM规范和JAVA语言规范里面没有找到相关的描述,这可能是属于JVM实现自由控制的范畴了。我们可以利用JDK自带的工具jvisualvm.exe来查看分配的空间有多大,至于存了什么内容,现在还不清楚。
/** * 构造一个无任何字段的空对象占多少内存 * @author gao_chun */ public class EmptyTest { public static void main(String[] args) throws InterruptedException{ //加到集合中,使垃圾无法回收 List<EmptyObject> emptys = new ArrayList<>(); for(int i=0;i<100;i++){ emptys.add(new EmptyObject()); } //打开jvisualvm,查看EmptyObject的大小为16字节 Thread.sleep(60*1000); } private static class EmptyObject{} }
这里面new不同的对象数(for循环次数),结果都是一样,我的JDK是64位,8字节是引用,8字节是堆内存,总共是16字节。如下图所示:
我们研究new一个Object对象占多少内存可能没什么实际意义,因为我们在编程的时候就可以确定对象树,基本可以确定对象大小,除了变长字段,当然,变长字段我们一般也会有长度限制。所以我们真正关心的是所有数据最终的大小,也就是数据库的大小。
那么这种没有什么实际意义的问题为什么要研究呢?我觉得只能用三个字来形容:好奇心。好奇心是驱使我们研究技术的强大推力,当我们工作了很多年,尤其是在不重视技术的公司,我们对技术还有激情吗?保持一颗敏感好奇的心,也许技术之路可以走的更长更远。
原文地址:http://blog.csdn.net/gao_chun/article/details/44834377