2013-03-26 31 views
7

我有一個複雜的大型多線程應用程序,我正在引入新功能。Java垃圾收集和原子事件/ stop gc暫停中斷一系列函數調用

我已經添加了一個專家硬件調用(通過供應商提供的JNI庫)。然而,在調用(非常快)函數之前,預先完成一些工作來填充發送給它的數據結構。

但是應用程序的GC配置文件非常不連貫/不好,似乎這些人口中的一些步驟被GC中斷。這很重要,因爲時間需要在第一個事件和切換到硬件資源之間保持不變或儘可能保持恆定。

有沒有辦法說,「GC同步」,這些操作,以便他們不會在世界GC暫停期間被阻止?

使用64位JDK 1.7上RHL5.5

感謝

+0

只是爲了澄清,您是否在全面GC掃描期間看到問題,或者是在進行輕微GC掃描? – JustDanyul 2013-03-26 11:31:01

+0

簡短的回答,沒有。如果你遇到阻止世界gc經常出現問題的地方。你使用什麼gc設置? – 2013-03-26 11:31:52

+0

JustSanyul,我相信這是在完全發生大問題時(操作順序可能需要很多毫秒,當它需要<5微秒,實際上自己寫操作需要1.3微米) – easytiger 2013-03-26 11:33:19

回答

2

GC行爲是不確定的,所以你不能確保同步。

三個選項來我的腦海:

  • 你創建大量的對象來填充 每個呼叫的數據結構?也許你可以重新使用它們來避免填充堆和GC自動調用。
  • 使用更多的預分配內存運行虛擬機以隔離gc呼叫。
  • 自己調用System.gc()時對您的應用程序無害。 這個調用只是一個建議(JVM可以忽略它),但我會嘗試給它 。

反正你的需求的最佳選擇是使用一個真正的實時語言實現,而不是Java的

+0

感謝Pablo.No調用本身在應用程序生命週期的持續時間內重用相同的字節緩衝區。 – easytiger 2013-03-26 12:05:05

+0

@pablo我認爲你的意思是「不能確保......」,而不是「可以」? – sharakan 2013-03-26 12:41:17

+0

@sharakan對!固定 – 2013-03-26 13:05:56

3

如果您遇到的問題的完整垃圾回收過程中,事實上,接下來的問題是你可以做些什麼來降低這些垃圾收集掃描的頻率。

首先,嘗試分析什麼情況會觸發這些完整的掃描,您是否在堆空間上運行得很低?如果是這樣,爲什麼你經常在堆上低調運行(是否有潛在的泄漏?)

此外,在較小(更快)的垃圾收集期間,對象從年輕一代(伊甸園和倖存者1)移動到倖存者2.如果它不適合倖存者2,他們將被轉移到終身,如果沒有足夠的空間終結,你會觸發全面掃描。所以,如果你的年輕一代很大,並且你有一定數量的長時間運行的物體,這可能會導致問題。

在一天結束時,你必須分析它。剖析應用程序,並確定何時以及爲什麼看到完整的垃圾回收,然後調整應用程序以減少應用程序的使用頻率,或者確保這些應用程序非常少,您可以在發生問題時進行「控制」。

2

爲了完整起見,您還可以使用實現實時Java(RTSJ)的JVM。

在實時JVM中,你可以將通過任何GC活動中斷的線程中執行的時間敏感的任務。不幸的是,這些日子裏沒有太多可用的RT JVM。

+0

的GC問題,謝謝,那正是我需要的,但可悲的是,這不是一個選項。 – easytiger 2013-03-26 23:30:33

2

如果您正在構建一個新的時間敏感任務,並且無法使用該任務修復JVM的GC行爲,那麼另一個選擇是您可以將任務移動到單獨的JVM。

進程間/機器通信意味着有更高的最低性能,但是在執行JNI通信的單獨JVM實例中,您可以調整GC,使其擁有比父進程更多的自由度,從而更好地控制choppiness 。