2015-07-28 37 views
4

我們有一個Java應用程序,它在Windows 7環境中通過JNA使用SWT和其他一些DLL。如何檢測內存在堆外的Java應用程序中泄漏?

我們已經看到JVM進程的內存使用量會隨着時間的推移而增加,但JVM堆積在正常的GC活動下相對穩定。

我們懷疑SWT和/或JNA/DLL有一些內存泄漏,但無法確定爲什麼或在哪裏。

Windows平臺上是否有任何工具可以幫助檢測這類問題?或者Java平臺上的任何工具可以幫助解決這個問題?任何建議都是值得歡迎的。

+0

SWT最常見的泄漏是應用程序無法「處理」像'Color' –

回答

2

在Java 8中有一個命令行開關:-XX:NativeMemoryTracking=<value>,其中值可以是off,summarydetail

您可以將其設置爲detail,然後您可以使用jcmd來查詢它。

這裏有一些關於這個here的官方文檔。儘管這個功能相當有限,但它可能只是幫助找到原因。


如果做不到這一點,確定問題的來源的原油,但有效的方法是更換一個虛擬版本(甚至非本地虛擬)的dll,看看您是否能重現同樣的問題。

+1

之類的東西「由於NMT不會跟蹤非JVM代碼的內存分配,因此您可能必須使用操作系統支持的工具檢測本機代碼中的內存泄漏「。對於我看來不會幫助追蹤JVM堆以外的內存泄漏的未經修飾的眼睛。如果我錯了,你可以詳細說明一下,因爲我很想了解這個主題。 – Joeblade

+1

@Joeblade原生內存也被JVM代碼分配用於其他目的,它不僅僅是你可以用它來檢查的堆。但是,它有它的侷限性,在這種情況下它可能不起作用。這仍然是一個值得了解的功能。 – biziclop

+0

@bizclop :)是啊,這就是爲什麼我希望哄你進行闡述。我之前沒有聽說過它,所以很好奇它。 – Joeblade