作者:
kdok123 (小天)
2014-12-22 21:00:17不好意思最近問題有點多...
ex1:
Integer a = 6;
bytecode:
0: bipush 6
2: invokestatic #19// Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
ex2:
Integer a = new Integer(6):
bytecode:
0: new #20 // class java/lang/Integer
3: dup
4: bipush 6
6: invokespecial #21
// Method java/lang/Integer."<init>":(I)V
9: astore_1
問題: 表面上看起來ex1好似沒有new,但實際上進到valueOf看還是new了
請問這兩個ex的差別在哪呢?
補充小問題: #數字:這個數字我查到的資料是說class裡的第幾個常量
可我不知道要怎麼利用這個變數debug... 可以舉個例子說明嗎?
作者:
yyc1217 (somo)
2014-12-22 22:54:00valueOf預設用到-128~127的值作的cacheconstructor則是保留原來new的方式 是問這個嗎?
作者:
kdok123 (小天)
2014-12-23 09:46:00是的! 可是做cache的方式還是new,想問的是這兩種new法有什麼樣的差異嗎? (貌似ex1方法運行效率比較好?)
作者:
yyc1217 (somo)
2014-12-23 11:05:00前者是一開始就new好存起來用 後者是要用時才new
作者:
ssccg (23)
2014-12-23 12:42:00一直new新的就佔記憶體啊
作者:
duckfly (Java ass)
2014-12-23 12:59:00-128~127一開始就在存於pool中了,不在這範圍的當然要new而且a=6是直接從pool撈出來,並不是runtime才new,valueOf原始碼你在仔細看清楚一點,6在範圍內不需要new
作者:
kdok123 (小天)
2014-12-23 14:15:00我的意思是這樣的... 每一次new都會對GC產生負擔吧?如果Integer剛開始就new好了255個object(constant pool),這樣GC是清不掉的?另外這樣的動作compile time的時候執行了這麼多次,不會拖累效能嗎?雖然runtime的時候可以直接呼叫new好的address可是這樣比需要用的時候再new,對效能更好嗎?
作者:
duckfly (Java ass)
2014-12-23 15:31:00String pool是需要才new, integer pool則一開始就new完,因int有boxing,加上小整數的經常使用(如迴圈i),因此"大部份"狀況下小整數先new起來放是比較好的做法而int pool是屬於permanet generation, GC是不會清的放在permanent的資料,GC是不會去掃描,也不會造成GC負擔(其實permanet區還是有major GC,但鮮少執行可視為無)
作者:
Chikei ( )
2014-12-23 19:33:001. Integer pool是Integer static field2. static field只有在class的class loader可以被gc的時候才會跟著變成可被gc3. Integer的class loader是Bootstrap,不會被gc(求反例?因為3,Integer class不會被gc,根據1/2,pool不會被gc
作者:
swpoker (swpoker)
2014-12-24 09:56:00我以為寫java的人可以不用管這種層面的問題