Java에서 문자열 메모리 위치 상세 정보 기반

2560 단어 java문자열위치
앞말
앞서 JVM의 메모리 영역 구분에 관한 글을 썼는데 어제 개미 김복의 면접을 보고 JVM에 관한 내용을 물어보고 JVM의 메모리 영역 구분에 대해 설명해 달라고 했습니다. 이 부분은 잘 맞혔지만 Java에 String이 저장된 위치를 물었습니다. 그 전에는 String이 변하지 않는 양이라는 것만 기억했습니다. 상량 탱크에 저장해야 하는데 나중에는 new에 String이 어디에 저장되어야 하는지 물었습니다.이것은 더미 안에 넣어야 하는데 나중에 String의 인용이 어디에 놓여 있느냐고 물었다. 당시에 어리석게도 더미 안에 넣었다고 했다. 지금 요약하면 기본 유형의 변수 데이터와 대상의 인용은 모두 창고 안에 놓여 있고 대상 자체는 더미 안에 놓여 있다. 현식적인 String 상량은 상량탱크에 놓여 있고 String 대상은 더미 안에 놓여 있다.
상량 탱크의 설명
상량탱크는 이전에 방법구 안에 놓여 있었다. 즉, 영구대 안에 있던 것이다. JDK7부터 더미 안으로 옮겼다.이 변화는 oracle의 release version notes의 **Important RFEs Addressed in JDK 7**에서 볼 수 있습니다.

Area: HotSpot
Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
RFE: 6962931
String 메모리 위치 설명
1. 현식 String 상수

String a = "holten";
String b = "holten";
• 첫 번째 코드가 실행된 후 상수 탱크에 홀튼의 String 대상을 만듭니다.
• 두 번째 문장을 실행할 때, 상량 탱크에 홀튼이 존재하기 때문에 새로운 String 대상을 만들지 않습니다.
• 이 문자열의 인용은 가상 머신 창고에 있습니다.
1. String 객체

String a = new String("holtenObj");
String b = new String("holtenObj");
• Class가 불러올 때 상수 탱크에 holtenObj의 String 대상을 만들었습니다. 첫 문장이 실행될 때 더미에 new String("holtenObj") 대상을 만듭니다.
• 두 번째 문장을 실행할 때 상량 탱크에 holten Obj가 존재하기 때문에 새로운 String 대상을 만들지 않고 더미에 new String ("holten Obj") 대상을 만듭니다.
검증해 봐.

/**
 * Created by holten.gao on 2016/8/16.
 */
public class Main {
  public static void main(String[] args){
    String str1 = " ";
    String str2 = " ";
    System.out.println(str1==str2);//true
    
    String str3 = new String(" ");
    String str4 = new String(" ");
    System.out.println(str3==str4);//false
  }
}
반환 결과:

true
false
이상의 자바에서 문자열 메모리 위치를 기반으로 한 상세한 설명은 바로 편집자가 여러분에게 공유한 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기