楼主:
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的人可以不用管这种层面的问题