2016-11-30 18 views
1

我有一個程序和強烈的懷疑是發生內存交換。我相信這種情況的原因是程序不時掛起。當我開始記錄時,事情變得更加混亂,因爲程序開始掛在不同的地方,執行不同的方法。
目前我正在使用32位IBM Java,2GB專用於該程序,所以我正好處於內存的邊緣。更改爲x64是可能的,但在此之前:
問題1:我可以在運行時以編程方式檢測內存交換嗎?或者我怎麼能至少給myslef一些提示(通過日誌記錄)交換正在發生。
而現在,我沒有內存使用日誌可用,但是,如果xmx是2Gigs,這只是RAM,如果內存交換髮生,它會甚至出現我沒有足夠的內存?
問題2:現在我想起來了,我可以記錄垃圾混合的開始嗎?我可以在運行時檢測到它嗎?
編輯:表示程序從數據庫中導出非常大量的數據。
編輯2:我可以編程方式禁止內存交換的Givem JVM嗎?Java - 在運行時檢測內存交換

+1

這是一個操作系統的東西,而不是一個java的東西 – the8472

+2

/proc/swaps記錄這樣的信息。您可以通過監視文件來檢測交換行爲。如上所述,內存交換是由操作系統而不是應用程序決定的。 – JQian

+1

我希望你知道交換和垃圾收集是兩個完全不同的東西。操作系統在物理內存耗盡時會進行交換,因此切換到64位JVM不會改變有關實際物理內存的任何內容。由於64位JVM能夠*使用更多的內存,因此它甚至可能會提高耗盡物理內存的機會。 – Holger

回答

2

我可以在運行時以編程方式檢測內存交換嗎?

您可以在操作系統中監視正在使用多少交換區或正在寫多少交換分區。你如何做到這一點取決於yoru操作系統>

如果內存交換髮生,它會甚至出現,我沒有足夠的內存?

如果你有足夠的內存不會發生交換。注意:即使沒有交換髮生,更多的內存也無濟於事。您很可能需要的不僅僅是您的應用程序內存,例如磁盤緩存也很重要。

我可以記錄垃圾混合的開始嗎?

您可以在另一個進程中,但是在發生停止世界操作時無法運行任何內容。

更改到x64是可能的,但在這之前:

Java 5.0中是最後一個版本,我會說可能是32位是最好的。那是十年前。

程序從數據庫中導出非常大量的數據。

1 GB比現在的一杯咖啡的成本更低。甚至幾十GB也不用擔心。數百GB的容量越來越大,如果你有幾個TB,你就會有一個有趣的問題。我的一些客戶有3TB的機器,並且他們有大量的數據,例如100秒TB。

我給了一臺舊電腦,這個電腦多年來一直沒有用到我大女兒身上,她把它給了我8歲的女兒。它有24 GB的內存,她用它來主要觀看YouTube視頻。

我可以以編程方式禁止內存交換給Givem JVM嗎?

您可以使用JNI將其鎖定到內存中,但是當機器交換堆空間時,機器仍處於死亡邊緣。