2010-10-12 14 views
6

我正在設計一個功能(Java方法),它將在移動設備上每秒執行40-80次。如何設計極其高效的功能

我想避免產生大量由GC收集的死變量,因爲函數運行(可能貫穿應用程序的整個生命週期)。

在C中我可能會使用volatile例如,以防止我的變量在每次執行函數的內存分配...我想在Java中做類似的事情,但不知道如何。

  • 1串的函數存儲數據
  • 4的整數
  • 2 1維字符串數組

一般地,在Java中,什麼是使用優選的方法上述變量但不是每次執行我的函數時重新分配它們(每秒40次以上)?

成員變量會「工作」,但這是最好的解決方案嗎?

謝謝! Brad

+0

它是否必須重新進入? – Nim 2010-10-12 15:29:06

+2

代碼示例將很有用 – 2010-10-12 15:29:37

+2

好奇你在移動設備上每秒執行40次以上的操作? – 2010-10-12 15:32:15

回答

3
  • 將這些字段包裝在一個類中{Java喜歡看對象}並分配一次並使用它。
  • 牢記字符串池的概念,你有String數組
+0

-1。使用靜態字段與分配內容的頻率完全無關。唯一相關的事情是對象創建的頻率(例如,使用'new'操作符的頻率) – 2010-10-12 15:45:03

+0

@標記同樣正確。檢查我的答案 – 2010-10-12 15:49:27

+0

靜態意味着它不會改變。問題是,在每次調用函數期間都會計算變量。 – 2010-10-12 16:54:02

0

我完全是答案達成一致。

每次調用你的函數,如果你的動態創建的變量會分配更多的內存作爲Java的GC並沒有完全清理,直到消滅階級被銷燬時被調用。

但是,如果你要多次調用該函數,那麼只是讓它們成爲類的成員變量也可以。

0

你可以使用靜態變量,但這就是假定這些變量是常量或不嚴重影響當前調用同一個功能其他線程改變他們。

如果你的代碼必須是可重入和靜態變量是不是一種選擇,你可以創建擁有這些變量的一個簡單的數據持有者對象,並把它作爲參數傳遞給你的函數。您的呼叫環境可以決定是否共享這些對象。

1

靜態成員變量,他們不會被卸載,直到班級卸載。請記住,如果所有對該類的引用都丟失了,那麼它可能會被GC化。我懷疑你的情況會是一個問題,但值得注意的是。此外,如果您正在創建包含靜態成員變量的類的新實例,您將從分配立場處於同一條船上。

0

使用靜態類字段,或者如果你要創建只有一個類的正常成員變量將工作的實例。

如果您需要更改字符串的內容考慮使用StringBuilder的,而不是將要創建/ gc'ed不變的字符串實例。

int's是原語,所以它們不是問題。

你的字符串數組將會沒問題,但考慮一下你正在放入的東西。你正在構造新的String對象並讓舊的對象gc?