关于java vm的垃圾收集
一、sun jvm的自动收集与编程显式调用System.gc()是有区别的,
自动回收的线程级别是最低的,如果系统越来越繁忙,压力越来越大,那么自动回收的线程运行的机会就会变小,甚至不会运行,结果是内存不能释放;
不建议使用编程调用System.gc()是因为垃圾收集时,系统会挂起,而编程调用一般是定时处理的,并且用户线程度高于5,即肯定会被运行(这个我用过,回收效果明显,做过j2me的朋友肯定会有更深的体会的),所以系统也会定时地被挂起,也就影响到了系统的响应,但并不明显。
二、综上所述,在适当的时候调用System.gc()两次是合适的,注意“两次”只是个人经验,大家可以试验。
三、另外,sun jvm只适合开发环境,即启动速读比较快,
在产品或生产环境下,我建议大家使用jrocket vm,从bea的官方网站上可以免费下载;这个vm不仅具有并行和分代垃圾收集的功能(即垃圾收集线程和用户线程具有同等的优先级,并且可以同时运行,不会挂起系统;垃圾收集具有更细的粒度级),并且可以大幅度提高系统运行性能。
一、sun jvm的自动收集与编程显式调用System.gc()是有区别的,
自动回收的线程级别是最低的,如果系统越来越繁忙,压力越来越大,那么自动回收的线程运行的机会就会变小,甚至不会运行,结果是内存不能释放;
不建议使用编程调用System.gc()是因为垃圾收集时,系统会挂起,而编程调用一般是定时处理的,并且用户线程度高于5,即肯定会被运行(这个我用过,回收效果明显,做过j2me的朋友肯定会有更深的体会的),所以系统也会定时地被挂起,也就影响到了系统的响应,但并不明显。
二、综上所述,在适当的时候调用System.gc()两次是合适的,注意“两次”只是个人经验,大家可以试验。
三、另外,sun jvm只适合开发环境,即启动速读比较快,
在产品或生产环境下,我建议大家使用jrocket vm,从bea的官方网站上可以免费下载;这个vm不仅具有并行和分代垃圾收集的功能(即垃圾收集线程和用户线程具有同等的优先级,并且可以同时运行,不会挂起系统;垃圾收集具有更细的粒度级),并且可以大幅度提高系统运行性能。