推 yyc1217: valueOf預設用到-128~127的值作的cache 12/22 22:54
→ yyc1217: constructor則是保留原來new的方式 是問這個嗎? 12/22 22:55
→ kdok123: 是的! 可是做cache的方式還是new,想問的是這兩種new法 12/23 09:46
→ kdok123: 有什麼樣的差異嗎? (貌似ex1方法運行效率比較好?) 12/23 09:47
※ 編輯: kdok123 (60.250.185.98), 12/23/2014 09:47:54
推 yyc1217: 前者是一開始就new好存起來用 後者是要用時才new 12/23 11:05
→ ssccg: 一直new新的就佔記憶體啊 12/23 12:42
→ duckfly: -128~127一開始就在存於pool中了,不在這範圍的當然要new 12/23 12:59
→ duckfly: 而且a=6是直接從pool撈出來,並不是runtime才new, 12/23 13:03
→ duckfly: valueOf原始碼你在仔細看清楚一點,6在範圍內不需要new 12/23 13:05
→ kdok123: 我的意思是這樣的... 每一次new都會對GC產生負擔吧? 12/23 14:15
→ kdok123: 如果Integer剛開始就new好了255個object(constant pool) 12/23 14:16
※ 編輯: kdok123 (223.136.244.216), 12/23/2014 14:17:17
→ kdok123: ,這樣GC是清不掉的? 12/23 14:17
→ kdok123: 另外這樣的動作compile time的時候執行了這麼多次,不會 12/23 14:17
→ kdok123: 拖累效能嗎? 12/23 14:18
→ kdok123: 雖然runtime的時候可以直接呼叫new好的address 12/23 14:18
→ kdok123: 可是這樣比需要用的時候再new,對效能更好嗎? 12/23 14:18
→ duckfly: String pool是需要才new, integer pool則一開始就new完, 12/23 15:31
→ duckfly: 因int有boxing,加上小整數的經常使用(如迴圈i), 12/23 15:34
→ duckfly: 因此"大部份"狀況下小整數先new起來放是比較好的做法 12/23 15:35
→ duckfly: 而int pool是屬於permanet generation, GC是不會清的 12/23 15:37
→ duckfly: 放在permanent的資料,GC是不會去掃描,也不會造成GC負擔 12/23 16:32
→ duckfly: (其實permanet區還是有major GC,但鮮少執行可視為無) 12/23 16:55
→ Chikei: 1. Integer pool是Integer static field 12/23 19:33
→ Chikei: 2. static field只有在class的class loader可以被gc的時候 12/23 19:34
→ Chikei: 才會跟著變成可被gc 12/23 19:34
→ Chikei: 3. Integer的class loader是Bootstrap,不會被gc(求反例? 12/23 19:36
→ Chikei: 因為3,Integer class不會被gc,根據1/2,pool不會被gc 12/23 19:37
→ swpoker: 我以為寫java的人可以不用管這種層面的問題 12/24 09:56