자바 의 탈출 분석 을 깊이 이해 하 다.
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
대상 만 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.