我使用 JNetPcap 库制作了一个数据包嗅探器。它是一个 .jar,从另一个监视系统资源(RAM、磁盘使用、活动网络接口、正在运行的进程等)的应用程序执行。我希望嗅探器在监视应用程序终止(由用户或不由用户终止)时自行关闭,我考虑使用监视应用程序创建一个文件并使用 fileLock 锁定它。然后在嗅探器的每个循环中,我都会检查文件是否仍然被锁定,如果不是(意味着监视器应用程序终止),那么我会调用 System.exit(0);
问题是当它们都在执行时,非分页内核内存使用量(实际上,不仅仅是非分页内核内存)上升得非常快。当我单独执行它们时不会发生这种情况。
当我同时运行它们时也不会发生这种情况,但是在嗅探器应用程序中注释了以下代码(负责检查监视器创建的文件是否仍然被锁定)
private void checkReleasedLock() throws IOException{
File file = new File("config\\file.lock");
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
FileLock lock = null;
try {
lock = channel.tryLock();
if(lock != null){ //It acquired the lock => the other application is terminated.
System.exit(0);
} else {
file = null;
channel = null;
lock = null;
}
} catch (Exception e) {
file = null;
channel = null;
lock = null;
}
}
只是为了向您展示内存使用量的增加,这是记录系统资源的监视器应用程序的输出:
######################################
# Beginning log: 2012-08-03 10:14:26 #
######################################
__________
RAM USAGE:
Total: 2040 MB
Free: 1260 MB (63.31 %)
Used: 720 MB (36.69 %)
Swap total: 4125 MB
Swap used: 1104 MB
Swap free: 3021 MB
Kernel Memory Total: 75876 KB
Paged: 52536 KB
Nonpaged: 23340 KB
几个小时后...
######################################
# Beginning log: 2012-08-03 12:14:27 #
######################################
__________
RAM USAGE:
Total: 2040 MB
Free: 1000 MB (50.37 %)
Used: 980 MB (49.63 %)
Swap total: 4125 MB
Swap used: 1307 MB
Swap free: 2818 MB
Kernel Memory Total: 213724 KB
Paged: 173724 KB
Nonpaged: 40000 KB
那个代码有问题吗?这可能是内存泄漏的原因吗?