[讨论] 关于集合类在堆内存中的开销

程序新手 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方法~
Global site tag (gtag.js) - Google Analytics