[问题] Integer初始化的问题

楼主: 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:00
valueOf默认用到-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:00
String 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:00
1. 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的人可以不用管这种层面的问题

Links booklink

Contact Us: admin [ a t ] ucptt.com