作为软件测试工程师,判断内存泄露类型对于定位和解决问题至关重要。以下是区分资源泄露和堆栈泄露的方法:
1. 基本概念区分
资源泄露(Resource Leak):
-
指非内存资源未正确释放,如文件句柄、数据库连接、网络套接字等
-
虽然不直接表现为Java堆内存增长,但会导致系统资源耗尽
堆栈泄露(Memory Leak):
-
指应用程序中对象不再被使用,但无法被GC回收
-
直接表现为Java堆内存持续增长,最终导致OOM
2. 判断方法
资源泄露的判断特征:
-
监控指标:观察文件描述符数量、线程数、TCP连接数等非堆指标
-
错误表现:出现"Too many open files"、"Can't create more threads"等错误
-
工具检测:
-
Linux下使用
lsof -p [pid]
查看进程打开的文件 -
使用
jstack
查看线程数量是否异常增长 -
使用JProfiler/VisualVM的"监视器&线程"标签
-
-
典型场景:
-
未关闭的InputStream/OutputStream
- <
-