[問題] Integer初始化的問題

看板java作者 (小天)時間9年前 (2014/12/22 21:00), 9年前編輯推噓2(2026)
留言28則, 6人參與, 最新討論串1/1
不好意思最近問題有點多... 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... 可以舉個例子說明嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.32.110 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1419253219.A.B48.html

12/22 22:54, , 1F
valueOf預設用到-128~127的值作的cache
12/22 22:54, 1F

12/22 22:55, , 2F
constructor則是保留原來new的方式 是問這個嗎?
12/22 22:55, 2F

12/23 09:46, , 3F
是的! 可是做cache的方式還是new,想問的是這兩種new法
12/23 09:46, 3F

12/23 09:47, , 4F
有什麼樣的差異嗎? (貌似ex1方法運行效率比較好?)
12/23 09:47, 4F
※ 編輯: kdok123 (60.250.185.98), 12/23/2014 09:47:54

12/23 11:05, , 5F
前者是一開始就new好存起來用 後者是要用時才new
12/23 11:05, 5F

12/23 12:42, , 6F
一直new新的就佔記憶體啊
12/23 12:42, 6F

12/23 12:59, , 7F
-128~127一開始就在存於pool中了,不在這範圍的當然要new
12/23 12:59, 7F

12/23 13:03, , 8F
而且a=6是直接從pool撈出來,並不是runtime才new,
12/23 13:03, 8F

12/23 13:05, , 9F
valueOf原始碼你在仔細看清楚一點,6在範圍內不需要new
12/23 13:05, 9F

12/23 14:15, , 10F
我的意思是這樣的... 每一次new都會對GC產生負擔吧?
12/23 14:15, 10F

12/23 14:16, , 11F
如果Integer剛開始就new好了255個object(constant pool)
12/23 14:16, 11F
※ 編輯: kdok123 (223.136.244.216), 12/23/2014 14:17:17

12/23 14:17, , 12F
,這樣GC是清不掉的?
12/23 14:17, 12F

12/23 14:17, , 13F
另外這樣的動作compile time的時候執行了這麼多次,不會
12/23 14:17, 13F

12/23 14:18, , 14F
拖累效能嗎?
12/23 14:18, 14F

12/23 14:18, , 15F
雖然runtime的時候可以直接呼叫new好的address
12/23 14:18, 15F

12/23 14:18, , 16F
可是這樣比需要用的時候再new,對效能更好嗎?
12/23 14:18, 16F

12/23 15:31, , 17F
String pool是需要才new, integer pool則一開始就new完,
12/23 15:31, 17F

12/23 15:34, , 18F
因int有boxing,加上小整數的經常使用(如迴圈i),
12/23 15:34, 18F

12/23 15:35, , 19F
因此"大部份"狀況下小整數先new起來放是比較好的做法
12/23 15:35, 19F

12/23 15:37, , 20F
而int pool是屬於permanet generation, GC是不會清的
12/23 15:37, 20F

12/23 16:32, , 21F
放在permanent的資料,GC是不會去掃描,也不會造成GC負擔
12/23 16:32, 21F

12/23 16:55, , 22F
(其實permanet區還是有major GC,但鮮少執行可視為無)
12/23 16:55, 22F

12/23 19:33, , 23F
1. Integer pool是Integer static field
12/23 19:33, 23F

12/23 19:34, , 24F
2. static field只有在class的class loader可以被gc的時候
12/23 19:34, 24F

12/23 19:34, , 25F
才會跟著變成可被gc
12/23 19:34, 25F

12/23 19:36, , 26F
3. Integer的class loader是Bootstrap,不會被gc(求反例?
12/23 19:36, 26F

12/23 19:37, , 27F
因為3,Integer class不會被gc,根據1/2,pool不會被gc
12/23 19:37, 27F

12/24 09:56, , 28F
我以為寫java的人可以不用管這種層面的問題
12/24 09:56, 28F
文章代碼(AID): #1Kc1NZj8 (java)