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

Java堆栈问题
背景说明:
最近工作中有一个业务,暂时考虑将每条记录对象放入内存,目标峰值定为50W条数据(50W个对象)。
在使用jvisualvm监控中发现,在内存中Bean实例数为50W,大小为4000W字节整(不是大约,是详细数据),但是在堆中显示的是实例数50W,大小为6000W字节(同上)。
在查阅《深入理解java虚拟机》中发现下图,我怀疑是否是因为jvisualvm监控中显示的大小为实例对象的大小,不包含对象中包含的属性和对象。但为何无论空对象,还是有赋值的对象实例堆大小和内存大小不一致。

我想问下各位,内存和堆中大小为何不一致。

------解决方案--------------------
你看这个吧,不知道是不是这个的原因。。
这里说JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。 
这个也挺好验证的,楼主内存中Bean实例数为10W的时候看堆大小就可以了
http://www.ibm.com/developerworks/cn/java/j-codetoheap/
------解决方案--------------------
你这个问题比较复杂,你给的信息太少,50w个对象放在内存中?以何种方式放在内存?单纯的new还是static静态list然后放置在list中?进程状态是什么样子的?对象随着进程的变化是否会产生变化?你最好把jvisualvm的截图和heapdump发出来,根据的你内存具体变化才能看出具体情况
还有用jvisualvm的visual GC插件看过具体的新生代老年代么
你给的信息太少,猜都不好猜