JVM 학습 노트와 실전 개선(3): 자바 대상 메모리 분배와 탈출 분석
1. Java 객체의 할당:
분배 정책: JVM이 탈출 분석을 시작하면 new의 대상이 먼저 창고에 분배를 시도한다. 분배가 안 되면 루트 로컬에 분배를 시도한다. 만약에 창고에 분배와 루트 로컬에 분배가 모두 실패하면 그 대상이 큰 대상인지 아닌지를 먼저 판단하고 큰 대상이라면 오래된 시대에 메모리를 분배한다. 그렇지 않으면 신세대 eeden구에 분배한다.2. 탈출 분석: 탈출 분석은 다른 최적화 수단에 근거를 제공하는 분석 기술로 그 기본적인 행위는 분석 대상의 동태적 역할 영역이다. 한 대상이 방법에 정의된 후에 외부 방법에 인용될 수 있다. 예를 들어 호출 파라미터로 다른 방법에 전달되는 것을 방법 탈출이라고 한다.클래스 변수에 복사되거나 다른 라인에서 접근할 수 있는 실례 변수인 외부 라인에 접근할 수도 있습니다. 이를 라인 탈출이라고 합니다.객체가 메서드나 스레드 외부로 도주하지 않을 경우 객체를 효율적으로 최적화할 수 있습니다.
3. 테스트 실례: 참고 코드
package com.vechace.JVM;
/**
* Description: 10000000 , , JVM
*
* @author vechace
* -XX:-DoEscapeAnalysis
* -XX:-EliminateAllocations
* -XX:-UseTLAB
* -XX:-PrintGC GC
*/
public class JVMTest1 {
class User{
int id;
String name;
User(int id,String name){
this.id = id;
this.name = name;
}
}
void alloc(int i){
new User(i,"name"+i);
}
public static void main(String[] args) {
JVMTest1 t = new JVMTest1();
long s1 = System.currentTimeMillis();
for(int i = 0;i<10000000;i++){
t.alloc(i);
}
long s2 = System.currentTimeMillis();
System.out.println(s2-s1);
}
}
IDE:Eclipse
run As --> run configuration --> Argument --> VM argument: 다음 구성을 입력합니다.
-XX:-DoEscapeAnalysis -XX:-EliminateAllocations -XX:-UseTLAB -XX:+PrintGC
결과 분석:
a. 탈출 분석, 스택에 할당되지 않음, 스레드 로컬 메모리를 사용하지 않음:
-XX:-DoEscapeAnalysis -XX:-EliminateAllocations -XX:-UseTLAB -XX:+PrintGC
콘솔 출력:
[GC (Allocation Failure) 49152K->688K(188416K), 0.0010012 secs]
[GC (Allocation Failure) 49840K->728K(188416K), 0.0009848 secs]
[GC (Allocation Failure) 49880K->640K(188416K), 0.0007432 secs]
[GC (Allocation Failure) 49792K->672K(237568K), 0.0008412 secs]
[GC (Allocation Failure) 98976K->640K(237568K), 0.0012708 secs]
[GC (Allocation Failure) 98944K->656K(328704K), 0.0008696 secs]
[GC (Allocation Failure) 197264K->624K(328704K), 0.0017397 secs]
[GC (Allocation Failure) 197232K->624K(320512K), 0.0003312 secs]
791
b. 스레드 로컬 메모리를 사용하여 eeden 구역에서 메모리를 분배할 때 잠그지 않아도 효율이 높아진다
-XX:-DoEscapeAnalysis -XX:-EliminateAllocations -XX:+UseTLAB -XX:+PrintGC
콘솔 출력:
[GC (Allocation Failure) 49760K->640K(188416K), 0.0007129 secs]
[GC (Allocation Failure) 49792K->624K(237568K), 0.0008062 secs]
[GC (Allocation Failure) 98928K->608K(237568K), 0.0014966 secs]
[GC (Allocation Failure) 98912K->728K(328704K), 0.0008608 secs]
[GC (Allocation Failure) 197336K->588K(328704K), 0.0016310 secs]
[GC (Allocation Failure) 197196K->620K(525312K), 0.0003275 secs]
528
c. 탈출 분석 활성화, 스레드 대체 사용, 스레드 로컬 메모리 사용, 효율 향상
-XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+UseTLAB -XX:+PrintGC
콘솔 출력:
[GC (Allocation Failure) 49152K->688K(188416K), 0.0010576 secs]
[GC (Allocation Failure) 49840K->640K(188416K), 0.0009443 secs]
[GC (Allocation Failure) 49792K->640K(188416K), 0.0007502 secs]
[GC (Allocation Failure) 49792K->696K(237568K), 0.0008981 secs]
[GC (Allocation Failure) 99000K->656K(237568K), 0.0011229 secs]
[GC (Allocation Failure) 98960K->608K(328704K), 0.0010558 secs]
[GC (Allocation Failure) 197216K->644K(328704K), 0.0015396 secs]
486
문제 분석: 탈출 분석을 시작할 때 비용이 존재하고 때로는 효율이 탈출 분석을 하지 않았을 때의 효율보다 높지 않다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.