자바 jdk 1.7 상수 탱크 는 어디로 옮 겼 습 니까?

오늘 상수 탱크 의 oom 을 모 의 했 는데 갑자기 설 정 된 매개 변수-XX:PermSize=10M-XX:MaxPermSize=10M 이 사용 되 지 않 는 것 을 발 견 했 습 니 다.동시에 메모리 가 계속 상승 하고 있 는 것 을 발 견 했 습 니 다.극치 에 오 르 면 안정 적 입 니 다.그 다음 에 시간 이 지나 면 보고 합 니 다.Exception in thread"main"java.lang.OutOfmory Error:GC overhead limit exceeded 이 이상 은 GC 의 시간 이 전체 운행 시간의 98%를 초과 해 야 보고 되 는 것 으로 GC 가 너무 오래 사용 되 는 것 을 방지 하기 위해 서 입 니 다.아 날로 그 상수 탱크 소스 코드:
public static void main(String[] args) throws Throwable {
        List<String> list = new ArrayList<String>();
        int i=0;
        while(true){
            list.add(String.valueOf(i++).intern());
        }

    }

그러면 문제 가 생 겼 습 니 다.우 리 는 예전 에 상수 탱크 가 자바 JVM 에 있 는 방법 구역 에 있다 는 것 을 알 고 있 었 습 니 다.많은 사람들 이 이 를'영구 세대'라 고 부 릅 니 다.-XX:PermSize=20M-XX:MaxPermSize=20M 을 통 해 크기 를 설정 할 수 있 습 니 다.이 지역 의 메모리 가 넘 치면 Exception in thread'main'자바.lang.OutOf Memory Error:PermGen space 의 메모리 가 이상 하 게 넘 칩 니 다.그러나 여 기 는 그렇지 않 습 니 다.오히려 GC 의 시간 이 너무 길 어 질 것 입 니 다.그러면 저 는 이 상수 탱크 가 자바 더미 로 이동 한 것 이 라 고 추측 합 니 다.다음 테스트 를 해 보 겠 습 니 다.우선,소스 코드 가 변 하지 않 고 실행 시 JVM 의 인 자 를 증가 합 니 다.-Xmx20m-Xms20m-XX:-UseGCoverheadLimit,여기 있 는-XX:-UseGCoverheadLimit 는 GC 를 닫 는 데 시간 이 너무 오래 걸 리 면 이상 을 보고 합 니 다.그리고 더미 의 크기 를 제한 하고 프로그램 을 실행 합 니 다.과연 잠시 후에 이상 을 보고 합 니 다.Exception in thread"main"자바.lang.OutOfmory Error:자바 힙 space 는 위의 이상 을 통 해 우리 가 테스트 한 상수 가 모두 더미 에 들 어 갔 음 을 알 수 있 습 니 다.그래서 메모리 쌓 기 를 제한 한 후에 상수 가 계속 증가 하고 메모리 쌓 기 가 넘 칠 것 입 니 다.우리 가 추측 한 것 과 마찬가지 로 나 도 홈 페이지 를 살 펴 보 니 홈 페이지 에 설명 이 있 는 것 을 발견 했다.http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html: 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
자신의 실천 과 홈 페이지 설명 을 통 해 자바 jdk 1.7 의 상수 탱크 가 확실히 더미 로 옮 겨 졌 음 을 알 수 있 습 니 다.또한 jdk 1.8 에 서 는 전체 방법 구역 을 제거 할 수 있 습 니 다.대신 원 공간(Metaspace)이라는 구역 입 니 다.더 알 고 싶 으 면 참고 하 세 요.http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html http://blog.csdn.net/zhyhang/article/details/17246223/

좋은 웹페이지 즐겨찾기