1、容器类对象或数组对象不清理,特别是静态的容器类或数组对象。主要出现场景是缓存的维护。
2、“重”对象没有显式释放或及时释放,如SWT.Color、SWT.Font;数据库连接;网络连接;IO流对象。大体上是因为此类对象最终调用的是操作系统本地资源,超出了JVM垃圾回收内存管理机制的管辖范围。相对于SWT的Color等对象,SWING的对应对象就不需要主动释放,因为SWING的界面是完全用java技术绘制的,在JVM内存管理范围内。
3、对象的生命周期太长,没有及时释放对无用对象的引用。最常见了。有种情况是addXXXListener()后,在监听的生命周期结束后不调用对应的removeXXXLitener(),多半后面会导致重复调用addXXXListener()多次的情况,当然系统的体现就是越来越慢了。所以A模块调用的B模块的addXXXListener()时,也需要弄清楚B模块是否有removeXXXListener()方法,毕竟addXXXListener()和setXXXListener()是两回事。
4、线程池没资源,有时见到JVM的这种异常报上来或自己设计的线程池没资源了。这很可能是设计问题,对于一个线程运行中可能导致线程中断挂起的异常没有捕获处理,结果线程中断挂起了,线程池维护再不那么智能,很快就会发现无线程可用了。另一种情况是多线程死锁,锁得多了很快也会发现没资源可用了。
5、单线程递归(当然多线程更容易出问题),导致超长的递归栈。
6、大量的字符串操作,很多时候应该用字符串缓冲StringBuffer和StringBuilder
7、内存的永久区不够(jdk7据说没有永久保存区,不知道会是啥样子),见http://lichen0921.iteye.com/blog/451092