[讨论] 关于集合类在堆内存中的开销
程序新手
2011-10-23
集合类对象经过add或者put之后在堆内存中的开销存放的是什么? 另外最近自己在工作之余研究Jconsole的代码,目的是为了做出一款可以在线上 远程监控JVM的开源项目,现在那些故障检测工具都是CS模式,实际部分公司线上不 会提供图形化界面,JDK自带的jhat命令产出的结果偶是没看太懂,所以有意向做出 一个BS模式的JVM故障检测工具,有意向的朋友可以利用业余时间一起交流~ 再次感谢RednaxelaFX大大的指点~ |
|
程序新手
2011-10-24
还是没有确定,都知道对象太大会导致堆内存OOM,但是集合类到底在堆内存中存放的是什么?
RednaxelaFX大大 求给力啊~ 怎么能证明集合类中存放的是添加进来对象在栈空间的引用? |
|
chenjingbo
2011-10-24
就是栈空间的引用而已..
Object obj = new Object();这个一共占了多少空间? 一个空的Object对象大小是8byte .但是,这里还有一个栈中的引用占了4byte,所以,一共是12byte.而你在集合里面一直添加 new Object(),那么,每次添加一个都是12byte(包括集合中的引用和具体分配在堆中的8byte). 最后说明下,上面的所有分析都没考虑逃逸分析的内容. |
|
程序新手
2011-10-24
chenjingbo 写道 就是栈空间的引用而已..
Object obj = new Object();这个一共占了多少空间? 一个空的Object对象大小是8byte .但是,这里还有一个栈中的引用占了4byte,所以,一共是12byte.而你在集合里面一直添加 new Object(),那么,每次添加一个都是12byte(包括集合中的引用和具体分配在堆中的8byte). 最后说明下,上面的所有分析都没考虑逃逸分析的内容. 你好,我可以把您的意思理解成,new普通对象的时候在堆内存开辟空间,被 list添加进来,又再list开辟的空间上面创建了一个副本?? 个人觉得如果是这样有点不靠谱.. |
|
chenjingbo
2011-10-25
List里面存放的是数组.其实就是一个4字节的引用而已.不是副本.
|
|
程序新手
2011-10-25
chenjingbo 写道 List里面存放的是数组.其实就是一个4字节的引用而已.不是副本.
list本身就是一个数组....如果是4个字节的引用,那么list在堆中的开销肯定是 对象在栈空间中的引用,如何证明? 还有如果发生了OOM,是对象太多,由于list的关联引用,所以GC不会回收? 还是由于list对象太大(4个字节太多)在堆开销的太大导致OOM? |
|
RednaxelaFX
2011-10-25
程序新手 写道 chenjingbo 写道 List里面存放的是数组.其实就是一个4字节的引用而已.不是副本.
list本身就是一个数组....如果是4个字节的引用,那么list在堆中的开销肯定是 对象在栈空间中的引用,如何证明? 还有如果发生了OOM,是对象太多,由于list的关联引用,所以GC不会回收? 还是由于list对象太大(4个字节太多)在堆开销的太大导致OOM? 我看到原帖的时候就不知道该如何回答好所以没回复… 问题里术语用得太乱了以至于不知道该从哪里开始讲。你抱着过多不正确的先入观念了。 程序新手 写道 那么list在堆中的开销肯定是对象在栈空间中的引用,如何证明?
例如说这个问题是如何扯上栈的?如果不理清你问题里的错误点的话,其实很难解答你真正的问题。 至于“如何证明”,详细开个调试器截几张内存实际状况的图就足以“证明”了。等你的问题理清楚了我可以截几张图。 还是先让IcyFenix大大来挑战一下这个问题吧。如果你确实仔细读了他那本书还是感到如此混乱的话,应该让IcyFenix大大检讨一下 |
|
程序新手
2011-10-25
RednaxelaFX 写道 程序新手 写道 chenjingbo 写道 List里面存放的是数组.其实就是一个4字节的引用而已.不是副本.
list本身就是一个数组....如果是4个字节的引用,那么list在堆中的开销肯定是 对象在栈空间中的引用,如何证明? 还有如果发生了OOM,是对象太多,由于list的关联引用,所以GC不会回收? 还是由于list对象太大(4个字节太多)在堆开销的太大导致OOM? 我看到原帖的时候就不知道该如何回答好所以没回复… 问题里术语用得太乱了以至于不知道该从哪里开始讲。你抱着过多不正确的先入观念了。 程序新手 写道 那么list在堆中的开销肯定是对象在栈空间中的引用,如何证明?
例如说这个问题是如何扯上栈的?如果不理清你问题里的错误点的话,其实很难解答你真正的问题。 至于“如何证明”,详细开个调试器截几张内存实际状况的图就足以“证明”了。等你的问题理清楚了我可以截几张图。 还是先让IcyFenix大大来挑战一下这个问题吧。如果你确实仔细读了他那本书还是感到如此混乱的话,应该让IcyFenix大大检讨一下 你好,谢谢您的回复,那本书上的知识点写的蛮清晰的,是我自己没表达清楚, 自我检讨,其实我的疑问很简单,我重新编辑下帖子,再次谢谢您的关注 |
|
chenjingbo
2011-10-25
引用 集合类对象经过add或者put之后在堆内存中的开销存放的是什么?
我觉得,你在add进去之前,肯定要新创建对象.这个对象都是开销. 另外就是list中的数组(以List举例),它是用数组存放对象的,那数组中的开销就是一个直接引用而已.. |
|
程序新手
2011-10-25
chenjingbo 写道 引用 集合类对象经过add或者put之后在堆内存中的开销存放的是什么?
我觉得,你在add进去之前,肯定要新创建对象.这个对象都是开销. 另外就是list中的数组(以List举例),它是用数组存放对象的,那数组中的开销就是一个直接引用而已.. 想法一样,只不过找不到好的方法证明,debug结果显示是对象的toString方法~ |