자바 의 대상 은 모두 쌓 여 있 습 니까?잘 못 했 어!
우 리 는 자바 를 사용 하 는 것 을 배 우 는 과정 에서 일반적으로 new 가 나 온 대상 이 모두 쌓 여 있다 고 생각 하지만 이 결론 은 그렇게 절대적 이지 않다.자바 대상 을 분배 하 는 과정 분석 을 통 해 자바 에서 new 가 나 온 대상 이 반드시 생각 하 는 더미 에 있 는 것 이 아니 라 는 것 을 알 수 있다.이 두 가 지 는 자바 의 탈출 분석 과 TLAB(Thread Local Allocation Buffer)다.본 고 는 먼저 이 두 가 지 를 소개 한 다음 에 자바 대상 의 분배 과정 을 소개 한다.
1.탈출 분석
1.1 탈출 분석의 정의
탈출 분석 은 자바 프로그램 에서 동기 부하 와 메모리 더미 분배 압력 을 효과적으로 줄 일 수 있 는 크로스 함수 전역 데이터 흐름 분석 알고리즘 이다.탈출 분석 을 통 해 자바 핫 스 팟 컴 파일 러 는 새로운 대상 의 인용 사용 범 위 를 분석 하여 이 대상 을 쌓 아 올 릴 지 여 부 를 결정 할 수 있다.
컴퓨터 언어 컴 파일 러 최적화 원리 에서 탈출 분석 은 지침 의 동태 범 위 를 분석 하 는 방법 으로 컴 파일 러 최적화 원리 의 지침 분석 과 외형 분석 과 관련 이 있다.변수(또는 대상)가 방법 에서 분 배 된 후에 포인터 가 되 돌아 오 거나 전체 적 으로 인 용 될 수 있 습 니 다.그러면 다른 과정 이나 스 레 드 에 의 해 인 용 될 수 있 습 니 다.이런 현상 을 포인터(또는 참조)의 탈출(Escape)이 라 고 합 니 다.
자 바 는 자바 SE 6u 23 및 이후 버 전에 서 지원 되 며 기본적으로 탈출 분석 옵션 을 열 었 습 니 다.자바 의 HotSpot JIT 컴 파 일 러 는 코드 를 다시 불 러 오 거나 동적 으로 불 러 올 때 코드 를 탈출 분석 할 수 있 으 며 자바 대상 이 쌓 여 있 는 스 레 드 의 특징 으로 인해 탈출 을 자바 의 중요 한 기능 으로 분석 할 수 있다.
1.2 탈출 분석 방법
자바 핫 스 팟 컴 파 일 러 는
[plain] view plain copy Choi J D, Gupta M, Serrano M, et al. Escape analysis for Java[J]. Acm Sigplan Notices, 1999, 34(10): 1-19.
Jong-Deok Choi,Manish Gupta,Mauricio Seffano,Vugranam C.Sreedhar,Sam Midkiff 등 이 논문'Escape Analysis for Java'에서 묘사 한 알고리즘 을 탈출 분석 한 것 이다.이 알고리즘 은 연결 도 를 도입 하여 연결 도 를 이용 하여 대상 과 대상 인용 간 의 접근 성 관 계 를 구축 하고 다음 을 바탕 으로 조합 데이터 흐름 분석 법 을 제시 했다.알고리즘 은 상하 문과 관련 되 고 흐름 이 민감 하 며 대상 의 임의의 차원 의 삽입 관 계 를 시 뮬 레이 션 했 기 때문에 분석 정밀도 가 비교적 높 지만 운행 시간 과 메모리 소모 가 상대 적 으로 크다.절대 다수의 탈출 분석의 실현 은 이른바'폐쇄 세계(closed world)'의 전 제 를 바탕 으로 한다.모든 실 행 될 수 있 는 방법 은 탈출 분석 을 하기 전에 이미 알 았 고 프로그램의 실제 운행 은 그들 간 의 호출 관 계 를 바 꾸 지 않 을 것 이다.그러나 실제 자바 프로그램 이 실 행 될 때 이런 가설 은 성립 되 지 않 는 다.자바 프로그램 이 가지 고 있 는 많은 특성,예 를 들 어 동적 클래스 로드,로 컬 함수 호출,반사 프로그램 호출 등 은 이른바'폐쇄 세계'의 약속 을 깨 뜨 릴 것 이다.
'폐쇄 세계'든'개방 세계'든 탈출 분석 은 프로 그래 밍 언어 가 아 닌 알고리즘 으로서 국내외 많은 학자 들 이 이 를 연구 하도록 끌 어 들 였 다.
1.3 탈출 분석 후의 처리
탈출 분석 을 통 해 세 가지 대상 의 탈출 상 태 를 얻 을 수 있다.
GlobalEscape(전역 탈출),즉 한 대상 의 인용 탈출 방법 이나 스 레 드.예 를 들 어 한 대상 의 인용 은 하나의 변수 에 복사 되 거나 도망 간 대상 에 저장 되 거나 이 대상 의 인용 을 방법의 반환 값 으로 호출 방법 에 되 돌려 주 는 것 이다.
Arg Escape(매개 변수 급 탈출),즉 방법 호출 과정 에서 대상 을 전달 하 는 응용 방법 입 니 다.이 상 태 는 조 정 된 방법의 바 이 너 리 코드 를 분석 하여 확인 할 수 있다.
NoEscape(탈출 하지 않 음),스칼라 교체 가 가능 한 대상 입 니 다.이런 대상 을 전통 적 인 더미 에 분배 하지 않 아 도 된다.
컴 파 일 러 는 탈출 분석 결 과 를 사용 하여 프로그램 을 최적화 할 수 있다.
퇴적 분배 대상 이 창고 분배 대상 이 되다.하나의 방법 중의 대상,대상 의 인용 이 탈출 하지 않 았 다 면,이 방법 은 창고 메모리 에 매우 보 이 는 더미 메모리 에 분 배 될 수 있다.
동기 화 제거.스 레 드 동기 화의 대 가 는 상당히 높 고 동기 화의 결 과 는 동시성 과 성능 을 낮 추 는 것 이다.탈출 분석 은 특정한 대상 이 항상 한 스 레 드 에 만 접근 하 는 지 여 부 를 판단 할 수 있다.만약 에 한 스 레 드 에 만 접근 하면 이 대상 에 대한 동기 화 작업 은 동기 화 보호 가 없 는 작업 으로 전환 되 어 병발 정도 와 성능 을 크게 향상 시 킬 수 있다.
벡터 대체.탈출 분석 방법 은 대상 의 메모리 저장 구 조 를 연속 으로 진행 하지 않 아 도 된다 는 것 을 발견 하면 대상 의 부분 을 CPU 레지스터 에 모두 저장 해 접근 속 도 를 크게 높 일 수 있다.
다음은 탈출 분석의 예 를 살 펴 보 자.
class Main {
public static void main(String[] args) {
example();
}
public static void example() {
Foo foo = new Foo(); //alloc
Bar bar = new Bar(); //alloc
bar.setFoo(foo);
}
}
class Foo {}
class Bar {
private Foo foo;
public void setFoo(Foo foo) {
this.foo = foo;
}
}
이 예 에서 우 리 는 두 개의 대상,Foo 대상 과 Bar 대상 을 만 들 었 고 우 리 는 Foo 대상 의 응용 값 을 Bar 대상 에 게 부여 하 는 방법 을 만 들 었 다.이때 Bar 가 쌓 여 있 으 면 Foo 대상 에 대한 탈출 을 일 으 킬 수 있 지만,이 사례 에서 컴 파일 러 는 탈출 분석 을 통 해 Bar 대상 이 example()방법 을 탈출 하지 않 았 다 는 것 을 알 수 있 기 때문에 Foo 도 example 방법 을 탈출 하지 못 했다 는 뜻 이기 도 하 다.따라서 컴 파 일 러 는 이 두 대상 을 창고 에 분배 할 수 있다.1.4 컴 파일 러 가 탈출 분석 을 거 친 효과
테스트 코드:
package com.yang.test2;
/**
* Created by yangzl2008 on 2015/1/29.
*/
class EscapeAnalysis {
private static class Foo {
private int x;
private static int counter;
public Foo() {
x = (++counter);
}
}
public static void main(String[] args) {
long start = System.nanoTime();
for (int i = 0; i < 1000 * 1000 * 10; ++i) {
Foo foo = new Foo();
}
long end = System.nanoTime();
System.out.println("Time cost is " + (end - start));
}
}
JVM 실행 매개 변수 설정:미 오픈 탈출 분석 설정:
-server -verbose:gc
탈출 분석 설정 오픈:-server -verbose:gc -XX:+DoEscapeAnalysis
탈출 분석 이 시작 되 지 않 은 상태 에서 운행 상황 은 다음 과 같 습 니 다.
[GC 5376K->427K(63872K), 0.0006051 secs]
[GC 5803K->427K(63872K), 0.0003928 secs]
[GC 5803K->427K(63872K), 0.0003639 secs]
[GC 5803K->427K(69248K), 0.0003770 secs]
[GC 11179K->427K(69248K), 0.0003987 secs]
[GC 11179K->427K(79552K), 0.0003817 secs]
[GC 21931K->399K(79552K), 0.0004342 secs]
[GC 21903K->399K(101120K), 0.0002175 secs]
[GC 43343K->399K(101184K), 0.0001421 secs]
Time cost is 58514571
탈출 분석 을 시작 한 상황 에서 운행 상황 은 다음 과 같다.Time cost is 10031306
뺑소니 분석 이 열 리 지 않 았 을 때 상소 코드 를 실행 하고 JVM 은 GC 작업 을 실 행 했 으 나,뺑소니 분석 이 열 린 상태 에서 JVM 은 GC 작업 을 수행 하지 않 았 다.또한 조작 시간 에 탈출 분석 을 시작 하 는 프로그램의 운행 시간 은 탈출 분석 시간 을 시작 하지 않 은 1/5 이다.2. TLAB
JVM 은 메모리 신세대 Eden Space 에서 TLAB(Thread-local allocation buffer)라 는 작은 스 레 드 개인 영역 을 열 었 습 니 다.기본 값 은 Eden Space 의 1%를 차지 하 는 것 으로 설정 되 어 있 습 니 다.자바 프로그램 에서 많은 대상 이 작은 대상 이 고 사용 한 적 이 있 으 면 잃 어 버 립 니 다.스 레 드 공유 가 존재 하지 않 고 빠 른 GC 에 적합 하기 때문에 작은 대상 에 대해 서 는 보통 JVM 이 TLAB 에 우선 배정 되 고 TLAB 의 분 배 는 스 레 드 개인 이기 때문에 잠 금 비용 이 없습니다.따라서 실천 에서 여러 개의 작은 대상 을 분배 하 는 효율 은 큰 대상 을 분배 하 는 효율 보다 높다.
즉,자바 의 모든 스 레 드 는 자신의 버퍼 를 TLAB(Thread-local allocation buffer)라 고 부 릅 니 다.모든 TLAB 는 하나의 스 레 드 만 조작 할 수 있 습 니 다.TLAB 는 bump-the-pointer 기술 과 결합 하여 빠 른 대상 분 배 를 실현 할 수 있 습 니 다.그 어떠한 자물쇠 도 동기 화 할 필요 가 없습니다.즉,대상 이 분 배 될 때 전체 더 미 를 잠 그 지 않 아 도 됩 니 다.자신의 버퍼 에 만 할당 하면 된다.
대상 할당 에 관 한 JDK 소스 코드 는 JVM 의 자바 대상 생 성[초기 화]에서 OpenJDK 소스 코드 에 대한 분석 을 참조 할 수 있 습 니 다.
3.자바 대상 할당 과정
컴 파 일 러 는 탈출 분석 을 통 해 대상 이 창고 에서 분배 되 는 지 더미 에서 분배 되 는 지 확인한다.쌓 아 올 리 는 것 이 라면 옵션 2 에 들 어 갑 니 다.
하면,만약,만약...top + size <= tlab_end,TLAB 에서 대상 을 직접 분배 하고 tlab 추가top 의 값,현재 대상 을 저장 할 수 있 는 TLAB 가 부족 하면 3.
TLAB 를 다시 신청 하고 현재 대상 을 다시 저장 하려 고 시도 합 니 다.놓 지 못 하면 4.
Eden 구역 에 자 물 쇠 를 추가 합 니 다.top + size <= eden_end 는 대상 을 Eden 구역 에 저장 하고 eden 증가top 의 값,Eden 구역 이 저장 할 수 없 으 면 5.
Young GC(minor collection)를 실행 합 니 다.
Young GC 를 거 쳐 Eden 구역 이 현재 대상 을 맡 기기 에 충분 하지 않 으 면 옛날 로 직접 배정 된다.
대상 이 쌓 아 올 리 지 않 는 주요 원인 은 쌓 아 올 리 는 것 이 공유 이 고 쌓 아 올 리 는 데 자물쇠 가 있 는 비용 을 분배 하 는 것 이다.TLAB 이 든 스 택 이 든 모두 스 레 드 가 개인 적 인 것 이 고 개인 적 인 것 은 경쟁 을 피 하 는 것 이다(물론 추가 적 인 문제 가 발생 할 수 있다).이것 은 전형 적 인 공간 으로 효율 을 바 꾸 는 방법 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.