gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:37:28 25 4
gpt4 key购买 nike

我使用 JNetPcap 库制作了一个数据包嗅探器。它是从另一个监视系统资源(RAM、磁盘使用情况、 Activity 网络接口(interface)、正在运行的进程等)的应用程序执行的 .jar。我希望嗅探器在监视器应用程序终止(无论是否由用户终止)时自行关闭,并且我考虑使用监视器应用程序创建一个文件并使用 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

这段代码有问题吗?难道是内存泄漏的原因?

最佳答案

Is something wrong with that code?

看起来每次调用该方法时都会创建一个未关闭的 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();
}
}

请注意,我还修复了一个导致所有异常被压缩的错误。

Could it be the cause of the memory leak?

是的,可能是这样。使用原始形式的代码,打开的文件 channel 仅在 Java 垃圾收集器最终确定对象时才会关闭。在那之前,每一个都将占用操作系统资源,这可以很好地解释未分页内核内存使用量的增加。

关于java - 运行此 Java 应用程序时,非分页内核内存疯狂增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11986818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com