자바 메모리 분포 실현 코드

메모리
더미 안의 메모 리 는 세 부분 으로 나 뉘 는데,젊 은 세대,늙 은 연대 와 원 공간 이기 때문에 더미 안의 메모리=젊 은 세대+늙 은 연대+원 공간 이다.다음은 세 부분 을 자세히 이야기 하 자.
1.1 젊 은 세대-젊 은 세대
  • new 생 성 대상 저장
  • 젊 은 세 대 는 수명 주기 가 짧 은 대상 을 가능 한 한 빨리 회수 하기 위해 서 이다
  • Eden
  • 대부분의 대상 이 Eden 구역 에서 생 성
  • Eden 구역 이 가득 찼 을 때 young gc 를 한 번 합 니 다.살아 있 는 대상 은 Survivor 구역 으로 복 사 됩 니 다.Survivor 구역 이 가득 찼 을 때 이 지역 의 생존 대상 은 다른 Survivor 구역
  • 으로 복 사 됩 니 다.
  • Survivor(보통 2 개)
  • 두 Survivor 구역 이 모두 찼 을 때 첫 번 째 Survivor 구역 에서 복사 되 고 살아 남 은 대상 은 일정 연령 이 넘 으 면 옛날(Tenured)
  • 로 복 사 됩 니 다.
  • Survivor 의 두 구역 은 대칭 적 이 고 선후 관계 가 없 으 며 모든 같은 구역 에 Eden 에서 복 제 된 대상 과 이전 Survivor 에서 복 제 된 대상 이 동시에 존재 할 수 있다.
  • age 를-XX:MaxTenuring Threshold 보다 큰 대상 을 옛날 로 승진 시 켰 다.(대상 은 Survivor 구역 에서 한 번 견 딜 때마다 age 가 한 살 증가 합 니 다.
  • 1.2 구세대(구세대)
  • 젊 은 세대 에서 N 번 의 쓰레기 수 거 를 거 친 후에 도 살아 남 는 대상 을 보관 하고 수명 주기 가 비교적 긴 대상 이다.
  • 생 성 할 때 공간 을 차지 하 는 대상 을 저장 합 니 다.이 대상 들 은 eden 을 거치 지 않 고 오래된 시대 에 직접 들 어 갑 니 다.큰 대상(크기 가-XX:Pretenure SizeThreshold 의 대상)
  • 1.3 메타 데이터(메타 공간)
  • 저장 류 의 데이터
  • 정적 클래스 와 방법 등 정적 파일 을 저장 합 니 다.지구 대 는 쓰레기 회수 에 현저 한 영향 을 미 치지 않 지만 일부 응용 프로그램 은 동적 으로 생 성 되 거나 일부 class 를 호출 할 수 있 습 니 다.예 를 들 어 Hibernate,Mybatis 등 이 있 습 니 다.이 때 는 이러한 운행 과정 에서 추 가 된 종 류 를 저장 하기 위해 비교적 큰 지구 대 공간 을 설정 해 야 합 니 다.
  • 지구 대 크기 파라미터 설정:-XX:MetaspaceSize, -XX:MaxMetaspaceSize
  • 1.4 소결
    图片
    1.기본 매개 변수:
    옛날 에는 전체 메모리 의 2/3 을 차지 했다.
    젊 은 세대 가 전체 메모리 의 3 분 의 1 을 차지한다.
    Eden 지역 은 전체 젊 은 세대 의 80%를 차지 하고 From 와 To 두 생존자 지역 은 각각 10%를 차지한다.
    2.신 구 연대 관련 jvm 파라미터
  • -XX:NewRatio 신 구 연대 비례 를 설정 합 니 다.예 를 들 어-XX:NewRatio=5 는 신 구 연대 비례 가 1:5 이 고 신세대 가 메모리 의 1/6 을 차지 하 며 옛날 연 대 는 5/6 을 차지 합 니 다.
  • -XX:SurvivorRatio신세대 중 eden 과 두 개의 Survivo 구역 크기 의 비율 을 설정 합 니 다.예 를 들 어-XX:SurvivorRatio=8,eden:s1:s2=8:1,기본 비율 은 8:1 입 니 다.
  • 3.young GC 는 신세대 에서 발생 하고 FUll GC 는 전체 쌓 인 공간 에서 발생 하 며 보통 옛날 에 공간 이 부족 하면 FULL GC 를 출발 합 니 다.
    메모리
    우리 의 게임 서버 는 netty 를 사용 하기 때문에 netty,Netty 의 ByteBuffer 는 DIRECT BUFFERS 를 사용 하여 쌓 아 올 린 직접 메모리 로 Socket 읽 기와 쓰기 만 하면 바이트 버퍼 의 2 차 복사,쌓 아 올 린 메모리 의 제로 복사 가 필요 하지 않 습 니 다.효율 을 높 였 습 니 다.운영 체제 커 널 은 직접 데 이 터 를 쌓 아 올 리 는 메모리 에 기록 하기 때문에 일반 API 처럼 운영 체제 커 널 캐 시 1 부,프로그램 을 읽 을 때 프로그램 공간 으로 복사 할 필요 가 없습니다.
    2.1 자바 에서 더미 밖에서 메모 리 를 개척 하 는 방법 은 두 가지 가 있다.
    1.DirectBufferByteBuffer.allocateDirect(size)
    2.JNI 로 자바 의 c/c++확장 을 쓰 고 확장 에 jvm 와 관련 되 지 않 고 시스템 에 메모 리 를 만 듭 니 다.
    2.2 외부 메모리 사용 의 장점
    1.쓰레기 수 거 를 줄 였 습 니 다.쓰레기 수 거 는 다른 작업 을 중단 하기 때 문 입 니 다.
    2.복사 속 도 를 빠르게 해서 원 격 으로 flush 를 쌓 을 때 직접 메모리(비 메모리)로 복사 한 다음 에 보 냅 니 다.쌓 인 메모리 가 이 일 을 생략 한 셈 이다.
    2.3 외부 메모리 의 단점
    메모 리 를 제어 하기 어렵 고 외부 메모 리 를 사용 하면 JVM 관리 메모리 의 타당 성 을 간접 적 으로 잃 고 자신 이 관리 하 는 것 으로 바 뀌 었 습 니 다.메모리 가 넘 칠 때 검색 하기 가 매우 어렵 습 니 다.
    쓰레기 회수
    3.1 쓰레기 수 거(GC)
    Minor GC
  • 일반적으로 새로운 대상 이 생 성 되 고 Eden 신청 공간 이 실 패 했 을 때 MinorGC 를 터치 하여 Eden 구역 에 GC 를 진행 하여 비 생존 대상 을 제거 하고 생존 대상 을 Survivor 구역 으로 이동 시 킨 다음 에 두 개의 Survivor 구역 을 정리한다.
  • 이 방식 의 GC 는 젊 은 세대 의 Eden 구역 을 대상 으로 하 는 것 으로 나이 든 세대 에 영향 을 주지 않 는 다.
  • 대상 대부분이 에덴 구 에서 시작 되 기 때문에 에덴 구 의 GC 는 빈번 할 것 이다.
  • Major GC / Full GC
  • 옛날(Tenured)이 가득 쓰 여 있다
  • 지구 대(Permanent)가 가득 쓰 여 있다
  • System.gc()호출 표시
  • 지난번 GC 이후 Heap 의 각 도 메 인 배분 전략 동적 변화
  • 더미 전 체 를 정리한다.
  • 소모 되 는 시간 이 비교적 길 기 때문에 Full GC 의 횟수
  • 를 최대한 줄 여야 한다.
    Full GC 가 나타 나 면 최소 한 번 이상 마 이 너 GC 를 동반 합 니 다(절대 가 아 닙 니 다.Parallel Sacvenge 수집 기 는 Major GC 정책 을 설정 할 수 있 습 니 다).
    Major GC 속 도 는 일반적으로 Minor GC 보다 10 배 이상 느리다.
    3.2 GC root
    프로그램 은 모든 인용 관 계 를 그림 으로 보고 하나의 노드 GC ROOT 부터 해당 하 는 인용 노드 를 찾 습 니 다.이 노드 를 찾 은 후에 이 노드 의 인용 노드 를 계속 찾 습 니 다.모든 인용 노드 를 찾 은 후에 나머지 노드 는 인용 되 지 않 은 노드,즉 쓸모없는 노드 로 여 겨 지고 메모 리 를 방출 해 야 하 는 대상 입 니 다.
    자바 에서 GC Root 의 대상 은
    1.가상 컴퓨터 스 택 에서 인 용 된 대상(로 컬 변수 표)
    2.방법 영역 에서 정적 속성 참조 대상
    3 방법 영역 에서 상수 참조 대상
    4.로 컬 방법 창고 에서 인 용 된 대상(Native 대상)
    3.3 상용 쓰레기 수 거기
    쓰레기 수집 기 는 메모리 회수 의 구체 적 인 실현 이다.가상 컴퓨터 가 제공 하 는 몇 가지 쓰레기 수집 기 를 소개 한다.
    시리 얼 수집 기(복제 알고리즘)
    신세대 단일 스 레 드 수집 기,태그 와 청 소 는 모두 단일 스 레 드 이 고 장점 은 간단 하고 효율 적 인 것 이다.
    시리 얼 올 드 수집 기(태그-정리 알고리즘)
    오래된 싱글 스 레 드 수집 기,Serial 수집 기의 오래된 버 전.
    ParNew 수집 기(정지-복사 알고리즘)
    신세대 수집 기 는 시리 얼 수집 기의 다 중 스 레 드 버 전 으로 볼 수 있 으 며 다 중 핵 CPU 환경 에서 시리 얼 보다 더 좋 은 표현 을 하고 있다.
    Parallel Scavenge 수집 기(정지-복사 알고리즘)
    병렬 수집 기 는 높 은 스루풋 을 추구 하고 CPU 를 효율적으로 활용 합 니 다.스루풋 은 보통 99%이 고 스루풋=사용자 스 레 드 시간/(사용자 스 레 드 시간+GC 스 레 드 시간)입 니 다.배경 응용 등 상호작용 에 대한 요구 가 높 지 않 은 장면 에 적합 하 다.
    Parallel Old 수집 기(정지-복사 알고리즘)
    Parallel Scavenge 수집 기의 오래된 버 전,병렬 수집 기,스루풋 우선
    CMS(Concurrent Mark Sweet)수집 기(태그-청소 알고리즘)
    높 은 병발,낮은 정지,최 단 GC 회수 정지 시간 을 추구 합 니 다.cpu 의 점용 이 비교적 높 고 응답 시간 이 빠 르 며 정지 시간 이 짧 습 니 다.다 중 핵 cpu 는 높 은 응답 시간 을 추구 합 니 다.
    G1(Garbage-First)
    현재 최신 회수 기 는 신세대 와 노년기 에 통용 된다.
    신세대 수집 기 에 사용 되 는 수집 기:Serial,PraNew,Parallel Scavenge옛날 수집 기 에 사 용 된 수집 기:Serial Old,Parallel Old,CMS저희 온라인 서버 는 G1 수집 기 를 사용 하고 있 습 니 다.
    총화
    위 에 많은 내용 을 열거 하 였 으 나,기억 해 야 할 아래 몇 시 면 된다.
    1.대상 의 이전 경로:Eden 에서 태 어 난 다음 에 Survivor 지역 에서 왔 다 갔다 하 며 한 번 씩 나 이 를 늘 리 고 나이 가 너무 많 으 면 바로 옛날 로 들어간다.
    2.Eden 구역 이 가득 차 서 minor Gc 생 성
    오래된 연대 가 만 료 되면 full gc 가 생 긴 다.
    3.회수 기 는 gc 를 실행 한 다 는 것 을 기억 하고 최신 G1 회수 기 를 선택 하면 됩 니 다.
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기