2012-08-16 63 views
0

我使用JNetPcap庫進行了數據包嗅探器。它是從另一個監視系統資源的應用程序(RAM,磁盤使用情況,活動網絡接口,運行進程等)執行的.jar文件。當監視器應用程序終止時(由用戶或不),我想讓嗅探器關閉自己,我想用監視器應用程序創建一個文件並使用fileLock鎖定它。然後在嗅探器的每個循環中,我會檢查文件是否仍然被鎖定,如果它不是(意味着監視器應用程序終止),那麼我會調用System.exit(0);運行此Java應用程序時,非分頁內核內存瘋狂增加

問題是,當它們都執行時,非分頁內核內存使用量(實際上,它不僅僅是非分頁內核內存)的速度非常快。當我單獨執行它時不會發生。

還當我同時運行它們不會發生,但在嗅探器應用程序下面的一段代碼註釋(負責檢查由監視器創建的文件是否仍處於鎖定狀態)

 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 

該代碼有問題嗎?它可能是內存泄漏的原因嗎?

+0

您是否需要在退出之前關閉文件? – assylias 2012-08-16 12:16:06

回答

2

該代碼有問題嗎?

看起來你每次調用該方法時都會創建一個未關閉的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垃圾回收器完成對象時纔會關閉。在那之前,每個人都會捆綁操作系統資源,這很好地解釋了未分頁內核內存使用率的增加。

+0

感謝您的解釋和片段。這很好! – 2012-08-21 11:30:36

相關問題