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

[求助]java的内存问题
用java写的一个服务,其中内存部分采用了DirectByteBuffer和常规的jvm对象。
想象:内部不断增大。
jvm的内存设置700M DirectByteBuffer设置为300M。

不断增加 直到将机器的4个g内存全部吃掉,然后就崩溃。

根据jmap等内存分析,没有任何问题。

有没有人遇到过同类的事情。

------解决方案--------------------
DirectByteBuffer 我记得API中说过,这个对象的使用场景,是不频繁创建和销毁的场景中的。
也就是说,这个对象,一般都用在,程序开始初始化一个这样的缓冲区,之后,就基本不会销毁,或者调整缓冲区的容量了。

据说是因为,这个缓冲区,直接使用操作系统底层的内存空间,分配和释放操作比较耗费操作系统的资源,但是,使用起来(写入数据,读取数据)的效率会比较高。

我估计,楼主爆掉内存的原因,肯定是在程序里面频繁的创建这类缓冲区对象(DirectByteBuffer 对象),因为JVM对已创建的对象的垃圾回收,不是实时的,
并且,这类对象的回收过程很费时费力,所以,这类对象的回收会被滞后和缓慢,
你的程序如果频繁创建这类缓冲区,造成操作系统没有及时回收这类资源,最终内存爆了。

建议楼主,先换成普通的ByteBuffer试试,我们创建缓冲区,一般也不会玩300M这么大,一般上百K就算大的了。
------解决方案--------------------
内存用完了没问题?


http://www.udpwork.com/item/3092.html