byte[] test = (sb.toString()).getBytes(); testString(new String(test));
相对于:
byte[] test = (sb.toString()).getBytes(); String temp = new String(test); testString(temp);
这样有什么区别?为什么第一种比第二种性能方面低很多,而且会有莫名其妙的异常。出问题经常的由于byte[]数组比较大。小的时候看不出来问题。
ringa_lee
如果你對JVM方面沒有了解的話,建議不要去談什麼性能,而且性能也不是這麼測的。
方法的參數和局部變數對應虛擬機棧1棧幀2中的局部變數表3,引用類型佔一個槽SLOT,所以你第二種寫法區別是棧幀多一個槽,創建String物件後,物件的參考在操作數棧String对象后,对象的引用在操作数栈4上,通过aload指令保存到本地变量表,调用testString方法的时候通过aload4
String
aload
aload指令壓到操作數棧棧頂。 總結:堆疊幀多一個SLOT,方法呼叫多了兩個指令,JIT預熱之後多餘指令會被消除,實際上沒有差別。 2.5.2. Java Virtual Machine Stacks ↩ 2.6. Frames ↩ 2.6.1. Local Variables ↩ 2.6.2. Operand Stacks ↩ 🎜
如果你對JVM方面沒有了解的話,建議不要去談什麼性能,而且性能也不是這麼測的。
方法的參數和局部變數對應虛擬機棧1棧幀2中的局部變數表3,引用類型佔一個槽SLOT,所以你第二種寫法區別是棧幀多一個槽,創建
上,透過String
物件後,物件的參考在操作數棧String
对象后,对象的引用在操作数栈4上,通过aload
指令保存到本地变量表,调用testString方法的时候通过aload
4aload
指令儲存到本地變數表,呼叫testString方法的時候透過aload指令壓到操作數棧棧頂。
總結:堆疊幀多一個SLOT,方法呼叫多了兩個指令,JIT預熱之後多餘指令會被消除,實際上沒有差別。
-
2.5.2. Java Virtual Machine Stacks ↩
-
2.6. Frames ↩
-
2.6.1. Local Variables ↩
-
2.6.2. Operand Stacks ↩
🎜