关于java吃内存的问题

我用java做了一个多线程的程序,然后在linux下运行。在启动后使用ps -ef可以看到好多我运行的程序,再使用top -p pid 可以看到每个进程的所耗的内存大概为14M左右,但是我在程序中用Runtime.getRuntime().totalMemory() 仅为2031616,而且Runtime.getRuntime().freeMemory()看到的也是在不停的释放内存,但是我通过top看到我机子的内存时不停的增长,而且将程序中止,机子内存也不会下降很多。
请教各位大虾这是什么原因,我先谢谢大家了。

你没有理解Java的资源回收基础知识,JVM回收内存只是在内存吃紧的情况下才启动,所以机子内存大概降低到只有一点点时,JVM才可以回收资源,也只是回收一点点。

那以bang的意思是不是,如果用java开发程序将会出现因为jvm回收内存不及时而导致系统崩溃的危险。可是这种情况该如何避免啊。我如何才能让jvm消耗内存到最小啊

应该用的是linux9以下的系统吧?嘿嘿

banq兄对JVM释放内存理解有误啊!JVM释放内存不是在内存吃紧的时候才释放(当然内存吃紧的时候会强制要求释放),从JDK1.2后,内存的释放是分散的,甚至随机的(只所以说随机是它有自己的算法,而不是严格的某种简单约束),这样,才可以让用户忽略内存回收所带来的系统代销。
至于楼主,我觉得完全没有必要担心内存,从来没有说用java开发一个内存小的系统(因为java的系统对内存的要求是动态的,而不是固定的),并且java开发的系统并不会对系统使用其他软件带来灾难(java的内存严格控制在虚拟机范畴之内)

楼上的仁兄,我经常发现用jdbc访问数据库时,当并发达到一定数目时,所耗内存远远高于jvm啊

用top看到的是java总的内存 不是单个线程的内存
java如果内存耗尽会抛出异常,甚至退出,不会对其他程序产生影响

内存回收,你可以设置jvm的参数,例如sun的HotSpot vm,你有多个cpu的是后可设置-XX:+UseParallelGC,-XX:+UseConcMarkSweepGC 参数(仅限版本1.4.1),-XX:SurvivorRatio=x可以设置x,调整年轻代对象不能很快的成为年老代对象,具体要用压力测试工具来测试你调整的参数。