运行此Java应用程序时非分页内核内存的疯狂增加

运行此Java应用程序时非分页内核内存的疯狂增加,java,windows,memory-leaks,ram,file-locking,Java,Windows,Memory Leaks,Ram,File Locking,我使用JNetPcap库制作了一个包嗅探器。它是一个.jar,由另一个监控系统资源(RAM、磁盘使用、活动网络接口、运行进程等)的应用程序执行。我希望嗅探器在监视器应用程序终止时(无论是否由用户终止)自动关闭,我考虑使用监视器应用程序创建一个文件,并使用fileLock锁定它。然后,在嗅探器的每个循环中,我都会检查文件是否仍然被锁定,如果没有(意味着监视器应用程序终止),那么我会调用System.exit(0) 问题是,当它们都在执行时,非分页内核内存的使用量(实际上,不仅仅是非分页内核内存)增

我使用JNetPcap库制作了一个包嗅探器。它是一个.jar,由另一个监控系统资源(RAM、磁盘使用、活动网络接口、运行进程等)的应用程序执行。我希望嗅探器在监视器应用程序终止时(无论是否由用户终止)自动关闭,我考虑使用监视器应用程序创建一个文件,并使用fileLock锁定它。然后,在嗅探器的每个循环中,我都会检查文件是否仍然被锁定,如果没有(意味着监视器应用程序终止),那么我会调用System.exit(0)

问题是,当它们都在执行时,非分页内核内存的使用量(实际上,不仅仅是非分页内核内存)增长得非常快。当我单独执行它们时,它不会发生

当我同时运行它们时,也不会发生这种情况,但是嗅探器应用程序中的以下代码注释了(负责检查监视器创建的文件是否仍然被锁定)

为了向您显示内存使用量的增加,这是记录系统资源的monitor应用程序的输出:

######################################
# 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
那个代码有什么问题吗?这可能是内存泄漏的原因吗

那个代码有什么问题吗

看起来每次调用该方法时,都会创建一个未关闭的FileChanel对象。分配
null
不会导致关闭任何内容

您应该这样编码,以确保FileChanel始终处于关闭状态:

   private void checkReleasedLock() throws IOException {
        File file = new File("config\\file.lock");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
        FileLock lock;

        try {
            lock = channel.tryLock();
            if (lock != null) {
                System.exit(0);
            }
        } finally {
            channel.close();
        }
    }
请注意,我还修复了一个导致所有异常被挤压的错误

这可能是内存泄漏的原因吗


是的,可能是。当代码保持其原始形式时,只有当Java垃圾收集器最终确定对象时,打开的文件通道才会关闭。在此之前,每一个都会占用操作系统资源,这很好地解释了未分页内核内存使用率的增加。

退出之前是否需要关闭文件?感谢您的解释和代码片段。这很有效!
   private void checkReleasedLock() throws IOException {
        File file = new File("config\\file.lock");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
        FileLock lock;

        try {
            lock = channel.tryLock();
            if (lock != null) {
                System.exit(0);
            }
        } finally {
            channel.close();
        }
    }