JVM中StringTable概述及調優

2021-10-02 14:11:20 字數 2611 閱讀 2052

string s1 =

"1";

//字串物件:3153

string s2 =

"2";

string s3 =

"3";

string s4 =

"4";

string s5 =

"5";

string s6 =

"6";

string s11 =

"1";

//字串物件:3159

string s21 =

"2";

string s31 =

"3";

string s41 =

"4";

string s51 =

"5";

string s61 =

"6";

//字串物件:3159

//在堆中建立乙個string物件

string s =

newstring

("a")+

newstring

("b");

//將此string物件中的值嘗試放入stringtable,並將串池中的物件返回,

string s1 = s.

intern()

;system.out.

println

(s1 ==

"ab");

// true

system.out.

println

(s ==

"ab");

// true

注意:當串池中沒有intern嘗試放入的字串時,會將字串放入串池,此時s也變為了串池中的物件

在1.6中會將s複製乙份放入串池中,並不會改變s的位置

//在串池中新增"ab"

string x =

"ab"

;//在堆中建立乙個string物件

string s =

newstring

("a")+

newstring

("b");

//將此string物件中的值嘗試放入stringtable,並將串池中的物件返回(並沒有成功放入)

system.out.

println

(s1 == x)

;// true

system.out.

println

(s == x)

;// false

注意:當串池中已經存在intern嘗試放入的字串時,則不會將字串放入串池,此時s還是堆中的物件,所以s不等於x

public

static

void

main

(string[

] args)

line.

intern()

;}system.out.

println

("cost:"

+(system.

nanotime()

- start)

/1000000);

}catch

(filenotfoundexception e)

catch

(ioexception e)

}

stringtablesizetime

128172 ms

1024

116 ms

4096

87 ms

入池去重,以及對效能的優化

public

static

void

main

(string[

] args)

//不入池

list.

add(line)

;//入池

} system.out.

println

("cost:"

+(system.

nanotime()

- start)

/1000000);

} system.in.

read()

;}catch

(filenotfoundexception e)

catch

(ioexception e)

}

string物件大小從6m降到500k,byte陣列從16m降到1m

詳解JVM 中的StringTable

字串常量池是 jvm中的乙個重要結構,用於儲存jvm執行時產生的字串。在jdk7之前在方法區中,儲存的是字串常量。而字串常量池在 jdk7開始移入堆中,隨之而來的是除了儲存字串常量外,還可以儲存字串引用 因為在堆中,引用堆中的字串常量很方便,所以可以儲存引用 這使得很多字串的操作在 jdk7中和在之...

StringTable效能調優

如果專案中有很多常量或者字串,適當調整引數 調整 xx stringtablesize 桶個數 如 xx stringtablesize 1009 如果存在堆中的字串比較多,且有很多重複的資料,那麼可以使用intern 減少記憶體占用。演示 intern 減少記憶體占用 xx stringtable...

利用stringtable 實現多語言

在 資源檢視 stringtable 下 右鍵 stringtable 插入副本 彈出對話方塊 選擇語言 如 英語 美國 確定 會新增加了乙個stringtable 然後在 新增 if getacp 936 如果判斷當前系統不是中文系統用下列函式將英文本串表設為使用字串表 setthreaduila...