java new String(byte)当参数和String引用当参数有什么区别,为什么性能差别很大?
ringa_lee
ringa_lee 2017-04-18 09:55:19
0
1
662
byte[] test = (sb.toString()).getBytes();
testString(new String(test));

相对于:

byte[] test = (sb.toString()).getBytes();
String temp = new String(test);
testString(temp);

这样有什么区别?为什么第一种比第二种性能方面低很多,而且会有莫名其妙的异常。出问题经常的由于byte[]数组比较大。小的时候看不出来问题。

ringa_lee
ringa_lee

ringa_lee

모든 응답(1)
Ty80

JVM에 대해 아무것도 모른다면 성능에 대해 이야기하지 않는 것이 좋으며 이러한 방식으로 성능을 측정하지는 않습니다.

메소드의 매개변수와 지역변수는 가상머신 스택1 스택 프레임2의 지역변수 테이블 3에 해당한다. 하나의 슬롯 SLOT이므로 두 번째 작성 방법의 차이점은 스택 프레임에 슬롯이 하나 더 있다는 것입니다. String 객체를 생성한 후 객체의 참조는 피연산자 스택 4에 있습니다. . aload 명령어를 통해 지역 변수 테이블에 저장되며, aload 명령어를 사용할 때는 피연산자 스택의 맨 위로 푸시됩니다.

요약: 스택 프레임에 SLOT이 하나 더 있고 메서드 호출에 명령어가 두 개 더 있습니다. 중복 명령어는 JIT 준비 후에 제거됩니다.


  1. 2.5.2. 자바 가상 머신 스택 ↩
  2. 2.6.프레임 ↩
  3. 2.6.1. 지역변수 ↩
  4. 2.6.2. 피연산자 스택 ↩
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿