我們知道類中的靜態變數在程式運行期間,其記憶體空間對所有該類的對象執行個體而言是共用的,為了節省系統記憶體開銷、共用資源,應該將一些變數聲明為靜態變數。通過下面的例子,你就會發現有什麼不同。
代碼一:
public class MemoryTest { static class Data{ private int week; private String name; Data(int i, String s){ week = i; name = s; } } Data weeks[] = { new Data(1,"monday"), new Data(2,"Tuesday"), new Data(3,"Wednesday"), new Data(4,"Thursday"), new Data(5,"Friday"), new Data(6,"Saturday"), new Data(7,"Sunday") }; public static void main(String[] args) { final int N = 20000; MemoryTest test = null; for (int i = 0; i <=N; i++) { test = new MemoryTest(); } System.out.println(test.weeks.length); } }
代碼二:
public class MemoryTest { static class Data{ private int week; private String name; Data(int i, String s){ week = i; name = s; } } static Data weeks[] = { new Data(1,"monday"), new Data(2,"Tuesday"), new Data(3,"Wednesday"), new Data(4,"Thursday"), new Data(5,"Friday"), new Data(6,"Saturday"), new Data(7,"Sunday") }; public static void main(String[] args) { final int N = 20000; MemoryTest test = null; for (int i = 0; i <=N; i++) { test = new MemoryTest(); } System.out.println(test.weeks.length); } }
我想大家應該發現上面那兩個類的區別了吧。
Data weeks[] 與 static Data weeks[]
代碼一會在記憶體中儲存20000個weeks的副本,而代碼二則在記憶體中儲存1個weeks的副本,然後共用該副本,這樣的話就不會造成記憶體的浪費。
雖然
靜態變數能節約大量的記憶體,但是並不是所有的地方都適合用,建議大家在下列條件都符合的情況下,盡量用靜態變數:
(1)變數所包含的對象體積較大,佔用記憶體較多。
(2)變數所包含的對象生命週期較長。
(3)變數所包含的對象資料穩定。
(4)該類的對象執行個體有對該變數所包含的對象的共用需求。
如果變數不具備上述特點,建議不要輕易使用靜態變數,以免弄巧成拙。
最後,再提一點記憶體的最佳化,就是有關對象的重用,比如:對象池和資料庫連接池等。那樣的話,是很節約記憶體空間的,不過,在用的時候要考慮各個方面,比如:運行環境的記憶體資源的限制等。為了防止對象池中的對象過多,要記得清除。