JVM的記憶體管理

2022-04-02 10:13:19 字數 1067 閱讀 2319

我們知道類中的靜態變數在程式執行期間,其記憶體空間對所有該類的物件例項而言是共享的,為了節省系統記憶體開銷、共享資源,應該將一些變數宣告為靜態變數。通過下面的例子,你就會發現有什麼不同。

**一:

1

public

class

memorytest 9}

1011

data weeks =;

2021

public

static

void

main(string args)

27system.out.println(test.weeks.length);28}

29}

**二:

1

public

class

memorytest 9}

1011

static

data weeks =;

2021

public

static

void

main(string args)

27system.out.println(test.weeks.length);28}

29}

我想大家應該發現上面那兩個類的區別了吧!

**一會在記憶體中儲存20000個weeks的副本,而**二則在記憶體中儲存1個weeks的副本,然後共享該副本,這樣的話就不會造成記憶體的浪費。

雖然靜態的變數能節約大量的記憶體,但是並不是所有的地方都適合用,建議大家在下列條件都符合的情況下,盡量用靜態變數:

(1)變數所包含的物件體積較大,占用記憶體較多。

(2)變數所包含的物件生命週期較長。

(3)變數所包含的物件資料穩定。

(4)該類的物件例項有對該變數所包含的物件的共享需求。

如果變數不具備上述特點,建議不要輕易使用靜態變數,以免弄巧成拙。

最後,再提一點記憶體的優化,就是有關物件的重用,比如:物件池和資料庫連線池等。那樣的話,是很節約記憶體空間的,不過,在用的時候要考慮各個方面,比如:執行環境的記憶體資源的限制等。為了防止物件池中的物件過多,要記得清除。好了,就到這裡吧。

JVM 記憶體管理

date 2020 10 29 16 30 00 updated 2020 10 29 17 10 00 參考文件 jvm記憶體劃分 暫存器 程式計數器pc拿到指令位址,放入指令暫存器ir中,cpu執行指令 本地方法區 方法區棧記憶體 stack 堆記憶體 heap,不是資料結構中的堆 int ar...

JVM自動記憶體管理

可 物件的判定方法 引用計數演算法 給物件新增乙個引用計數器,每乙個引用它的地方時,就 1,失效就 1,為0時候就是不能再被用了。缺陷 注意迴圈引用,就是你用我的,我用你的,叫做死鎖吧,引用計數器是1,無法 a.b b b.a a 現在主流的jvm沒有使用這個演算法。可達性分析演算法 通過一系列稱為...

jvm記憶體管理(二)

關於物件訪問 object o new object 此語句將會在 堆中 開闢空間儲存 new object 的例項資訊,同時還必須包括物件型別,父類,實現的介面,方法等資訊的位址資訊 這些儲存在方法區中 reference 型別 儲存的是指向物件的引用,具體的實現方式根據jvm的不同,一般有兩種 ...