内存溢出和锁表问题的分析与解决
李伦
1.问题的提出
内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是
可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定
位到程序中是某处出现了问题。内存溢出与锁表则不然,一般现象是操作一般时间后系
统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规
律,查看日志或查看数据库也不能定位出问题的代码。
更严重的是内存溢出与数据库锁表在系统开发和单元测试阶段并不容易被发现,当
系统正式上线一般时间后,操作的并发量上来了,数据也积累了一些,系统就容易出现
内存溢出或是锁表的现象,而此时系统又不能随意停机或重启,为修正 BUG 带来很大的
困难。
本文以笔者开发和支持的多个项目为例,与大家分享在开发过程中遇到的 Java 内存
溢出和数据库锁表的检测和处理解决过程。
2.内存溢出的分析
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运
行要用到的内存大于虚拟机能提供的最大内存。为了解决 Java
中内存溢出问题,我们
首先必须了解 Java
是如何管理内存的。Java
的内存管理就是对象的分配和释放问题。
在 Java
中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器 (Garbage
Collection,GC)完成的,程序员不需要通过调用 GC 函数来释放内存,因为不同的 JVM
实现者可能使用不同的算法管理 GC,有的是内存使用到达一定程度时,GC 才开始工作,
也有定时执行的,有的是中断式执行 GC。但 GC 只能回收无用并且不再被其它对象引用
的那些对象所占用的空间。 Java
的内存垃圾回收机制是从程序的主要运行对象开始检