자바 의 탈출 분석 을 깊이 이해 하 다.

탈출 분석

public static StringBuffer craeteStringBuffer(String s1, String s2) {
  StringBuffer sb = new StringBuffer();
  sb.append(s1);
  sb.append(s2);
  return sb;
}

public static String createStringBuffer(String s1, String s2) {
  StringBuffer sb = new StringBuffer();
  sb.append(s1);
  sb.append(s2);
  return sb.toString();
}
첫 번 째 코드 중의 sb 는 도 망 갔 고 두 번 째 코드 중의 sb 는 도 망 쳤 다.
자바 코드 가 실 행 될 때 JVM 인 자 를 통 해 탈출 분석 을 시작 할 지 여 부 를 지정 할 수 있 습 니 다,-XX:+DoEscapeAnalysis :탈출 분석 을 시작 하 는 것 을 의미 합 니 다.-XX:-DoEscapeAnalysis:탈출 분석 을 닫 겠 다 는 뜻 입 니 다.jdk 1.7 부터 기본적으로 탈출 분석 을 시 작 했 습 니 다.닫 으 려 면 지정-XX:-Do EscapeAnalysis 가 필요 합 니 다.
역할.
탈출 분석 을 사용 하면 컴 파일 러 는 코드 를 다음 과 같이 최적화 할 수 있다.
자물쇠 제거
대상 이 한 스 레 드 에서 만 접근 할 수 있 는 것 으로 밝 혀 지면 이 대상 의 작업 은 동기 화 를 고려 하지 않 아 도 된다.
자물쇠 제거 전

public void f() {
  Object o = new Object();
  synchronized(o) {
    System.out.println(o);
  }
}
자물쇠 제거 후

public void f() {
  Object o = new Object();
  System.out.println(o);
}
스칼라 교체
분리 대상 또는 스칼라 교체.어떤 대상 은 연속 적 인 메모리 구조 로 존재 하지 않 아 도 접근 할 수 있 습 니 다.대상 의 부분(또는 전부)은 메모리 에 저장 하지 않 고 CPU 레지스터 에 저장 할 수 있 습 니 다.
스칼라 교체 전

public static void main(String[] args) {
  alloc();
}

private static void alloc() {
  Point point = new Point(1,2);
  System.out.println("point.x="+point.x+"; point.y="+point.y);
}
class Point{
  private int x;
  private int y;
}
스칼라 교체 후

private static void alloc() {
  int x = 1;
  int y = 2;
  System.out.println("point.x="+x+"; point.y="+y);
}
창고 분배
자바 가상 컴퓨터 에서 대상 은 자바 더미 에서 메모 리 를 분배 하 는 것 이 보편적 인 상식 이다.그러나 탈출 분석 을 통 해 한 대상 이 탈출 방법 이 없다 는 것 을 알 게 되면 창고 분배 로 최 적 화 될 수 있다 는 특수 한 상황 이 있다.이렇게 하면 더미 에 메모 리 를 분배 할 필요 도 없고 쓰레기 수 거 를 할 필요 도 없다.

public static void main(String[] args) {
  long a1 = System.currentTimeMillis();
  for (int i = 0; i < 1000000; i++) {
    alloc();
  }
  //       
  long a2 = System.currentTimeMillis();
  System.out.println("cost " + (a2 - a1) + " ms");
  //               ,  sleep
  try {
    Thread.sleep(100000);
  } catch (InterruptedException e1) {
    e1.printStackTrace();
  }
}

private static void alloc() {
  User user = new User();
}

static class User {

}
alloc 방법 에서 User 대상 을 정 의 했 지만 방법 외부 에서 그 를 인용 하지 않 았 습 니 다.이 대상 이 alloc 외부 로 도망 가지 않 는 다 는 것 이다.JIT 의 탈출 분석 을 거 쳐 메모리 배분 을 최적화 할 수 있다.
미 오픈 탈출 분석

Xmx4G -Xms4G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
결실

➜ ~ jps
2809 StackAllocTest
2810 Jps
➜ ~ jmap -histo 2809

 num   #instances     #bytes class name
----------------------------------------------
  1:      524    87282184 [I
  2:    1000000    16000000 StackAllocTest$User
  3:     6806    2093136 [B
  4:     8006    1320872 [C
  5:     4188     100512 java.lang.String
  6:      581     66304 java.lang.Class
더미 에 모두 100 만 개의 StackAllocTest$User 인 스 턴 스 를 만 들 었 습 니 다.
탈출 분석 오픈

-Xmx4G -Xms4G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 
결실

➜ ~ jps
709
2858 Launcher
2859 StackAllocTest
2860 Jps
➜ ~ jmap -histo 2859

 num   #instances     #bytes class name
----------------------------------------------
  1:      524   101944280 [I
  2:     6806    2093136 [B
  3:     83619    1337904 StackAllocTest$User
  4:     8006    1320872 [C
  5:     4188     100512 java.lang.String
  6:      581     66304 java.lang.Class
탈출 분석 을 시작 한 후(-XX:+DoEscape Analysis)메모리 에 8 만 여 개StackAllocTest$User대상 만 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기