[JVM 지식 프레임 워크 요약]

JVM 메모리 유통

  • 스레드 공유 : 데이터 영역
    에있어서, 영역 -> 클래스 정보, 정적 변수
    힙 -> 객체 어레이
  • 스레드 검역
    가상 머신 스택 -> 방법
    네이티브 메소드 스택 -> 로컬 네이티브 메소드 라이브러리
  • 스택, 프로그램 카운터
  • JVM 운영 데이터

프로그램 카운터

격리에서 바이트 코드의 행 번호 스레드는 현재 스레드에 의해 수행되는 비교적 적은 메모리 공간은 독립 실행 유닛은 가상 머신에 의해 유지 된 CPU에 의해 OOM없는 장소 만의 구현이며, 이는 OOM 표시되지

VM 스택

Java 메소드가 실행됩니다

메소드 호출 스택 프레임 동안 가상 머신 스택에 스택 프레임이다 : 로컬 변수 테이블 (변수), (A + B의 결과를 저장) 오퍼랜드 스택 동적 링크 (객체 참조 어드레스)에있어서, 출구 (값 리턴 스레드의 깊이보다 더 큰) 스택 깊이 StackOverflowError가 허용 가상 머신을 요청

네이티브 메소드 스택

이 Java 가상 머신 및 기본 방법은 하나의 스택 JVM 자바 가상 머신에 스택 스택 프레임 핫스팟 표준 네이티브 메소드 스택과 떨어져 스택으로 자바 실행 메모리 영역 기본 방법이며,

더미

자바 메모리 저장 영역 오브젝트 인스턴스가, 거의 모든 객체 인스턴스는 모든 스레드가 새로운 세대, 오래된 년을 공유 여기에 할당 된 jmap는 -heap PID;

방법 지구

메모리의 각 스레드는 공유 메모리 영역에, (가비지 수집기 수 관리 영역을 보자) 가상 머신 정보, 상수, 정적 변수, 코드 및 영구 세대 데이터 핫스팟 구현 영역의 다른 유형의 컴파일 시간 컴파일러로드 된 복구 및 제거 일정 수영장 그가 메모리 할당의 요구를 충족 할 수 없습니다 때, OOM을 던졌습니다

런타임 상수 풀

런타임 상수 풀의 영역에있어서의 일부 클래스 필드, 또한, 상기 방법은 상수 풀의 인터페이스, 클래스로드 시간 상수 풀 기억 영역의 동작 방법에 대한 컴파일러 생성 된 문자 및 기호 참조를 저장하는이 부분의 양 .

STRINGTABLE 구조 HashSet의 방법은, 영역의 일부이며,이 방법은 여전히 ​​OOM 지역별 제한

자바 객체 생성

-> 정적 메소드 정적 블록

  1. 새로운 명령들은 상수 풀을 이미로드 된 어떠한 참조 부호가없는 판단
  2. 클래스가로드되어 있는지 여부, 구문 분석, 초기화를 결정
  3. 새 개체가 힙 메모리 자바에 할당의 경우
    1) 포인터 충돌 (비교 메모리 깔끔한)

    : 1. 2. 이동 포인터 할당 된 메모리, 비 원자 단계의 동시성 문제는, 실패시 다시 시도의 방법으로 결합 자바 가상 머신의 CAS를 발생할 수있다 원자 갱신 조작 보장
    ) 무료 목록 2 (혼돈 메모리)
    메모리 힙 메모리 무료 주소
    : 1. 2 단계 동시성 문제가 발생할 수 있습니다 할당 된 메모리 무료 목록의 주소가 아닌 원자 수정, 자바 가상 머신 결합 CAS의 실패시 다시 시도 그것은 원자 업데이트 작업을 보장하기 위해 의미
  4. 메모리 공간에 할당됩니다 제로 값으로 초기화된다
  5. 설정 오브젝트 헤더 정보 (GC 세대 에이지, 해시 객체의 메타 정보)
  6. 실행 방법

자바 객체 메모리 레이아웃

오브젝트의 속성 값 -> 데이터 객체의 첫 번째 인스턴스가 64 비트 64 비트 시스템, 시스템 메모리 (32) (32), (8)의 복수의 저장

자바 객체에 액세스

  1. 직접 액세스 포인터
  2. 방문 손잡이

    대비를 :
  3. 액세스 효율 : 고효율 직접 액세스 포인터 (핫스팟이 방법)
  4. 가비지 수집 : 높은 액세스 효율을 처리, 가비지 컬렉터 핸들 만 풀을 업데이트하고, 직접 액세스 방법은 참조 포인터 주소를 업데이트해야합니다

가비지 수집 알고리즘

  1. 레퍼런스 카운트

    다른 변수는 참조 된 오브젝트에 할당 될 때 오브젝트 인스턴스 변수에 할당되고, 카운트 변수를 1로 설정 (후 오브젝트 인스턴스 참조 카운터 + 1, B, A = B) +1 카운트 , 상기 라이프 사이클을 통해 객체 인스턴스에 대한 참조 (방법을 실행) 또는 새로운 값으로 설정되면 -1 오브젝트 기준 카운터의 예는
    원형 기준 해결할 수
    도달 분석
    GC 루트 (VM 스택 원시 메소드 스택에서 참조 된 오브젝트 참조 된 객체는 객체 속성이 정적 메소드 영역에있어서, 일정한 기준 오브젝트 영역을 참조)
  2. - 마크 스윕

    개체 태그는 이후 통일 복구 완료를 표시, 복구 할 필요가
    : 이하
    이 명확 처리 효율이 높지 않다 표시 1. 효율성
    공간 문제, 삭제 후 개별 메모리 조각화 마크의 많은 수의 과도한 파편 (2) 프로그램이 큰 개체를 할당 할 필요가있을 때, 당신은 충분한 연속 메모리를 발견하고 사전에 쓰레기 수거 작업을 트리거했습니다 수 없습니다
  3. 마크 - 복사

    라이브 복사는 메모리 블록 B에 (생존자에 대한)를 메모리 블록을 객체, 다음 메모리 블록 A (에서 에덴 + 생존자) 빈,
    개체 이동의 작은 부분 만이 더 많은 개체가 재활용하는 것입니다
    에덴 : 서바이버에서 :. = 8 :. 1 :. 1 생존자
    98 % 목표 "죽음 Chaosheng 저녁"차세대 메모리는 90 % (80 % + 10 %), 목표의 98 %가 재순환 일반적으로 90 % 미만으로 사용할 객체가 (객체의 10 % 이상 생존), 공간 생존자가 충분하지 않습니다 복구 할 때, 우리의 옛 할당 보증에 의존 할 필요가
  4. 마크 - 마무리

    된 것은 복제 알고리즘에 적합하지입니다
  5. 2. 추가 복사 작업은 50 %가 낭비되는 공간 3. 종종 옛 시대 오브젝트의 추가 공간 할당 4. 가능한 보장 100 % 생존율을 필요로 증가

단계 :

  1. 개체의 생존을 마무리하는 것은, 한쪽 (왼쪽 위)로 이동하지 구조화 결코 정기적하게되고, 그 경계 외부에서 직접 메모리를 청소

직렬 수집기

단일 스레드 가비지 콜렉터는 사용자 스레드는 먼저 임시 점을 확보 한 다음 일련 GC 쓰레드 재활용 및 기타 GC 스레드 완료 한 다음 기능을 계속하기 전에 사용자 스레드가이었다 싱글 스레드 : 세계 중지
와 데스크톱 응용 프로그램 (GC 짧은 시간) : 장면을 새로운 세대, 클라이언트 단말기

ParNew 수집기

직렬 컬렉터의 멀티 스레드 버전의 새로운 세대를위한, 그리고 유일한 방법은 서버 모드 -XX에서 실행되는 CMS 컬렉터와 작업 : ParallelGCThreads는 가비지 컬렉터 = CPU 코어 수 (과도한 소비가 컨텍스트 스위칭이 발생할 수 있습니다) 스레드의 수를 제한 병렬 병렬 가비지 컬렉션에서 다수의 스레드가 사용자에게 여전히 동시 스레드 보류 : 동시 사용자 스레드 가비지 수집기, 사용자 스레드와 쓰레기 스레드하는 다른 CPU에서 실행

병렬 소기 수집기

수집기 신세대 복사 알고리즘 병렬 다중 스레드 콜렉터 우려 특정 우선 집 전체 (처리량 = CPU 예를 들어, 사용자 코드 실행 시간 / CPU 총 실행 시간 : 사용자 스레드의 실행 시간의 99 %, 1 % 회복 시간 쓰레기, 다음 높은 처리량은 사용자의 상호 작용 작업 CMS 가비지 콜렉션 일시 정지 시간을 단축하기 위해 너무 많은 관심없이 백그라운드에서 작업에 적합한 가능한 한 빨리 프로그램을 완료하는 데 CPU 시간 컴퓨팅 작업을 효율적으로 사용 될 수 있습니다) 99 % 처리량 대화 형 프로그램, 좋은 반응 속도가 사용자 경험 -XX을 향상시킬 수 GCTimeRatio 매개 변수, 99 %의 기본은 (시간 사용자 스레드 CPU의 전체 시간의 99 %를 차지) : MaxGCPauseMillis GC 시간 매개 변수를 일시 정지, 매개 변수는 자주 GC-XX가 너무 작

직렬 오래된 집

알고리즘을 - "마무리 마크"직렬는 기존의 단일 스레드 세 수집하는의 수집가의 버전입니다

병렬 오래된 집

알고리즘 - 기존의 멀티 스레드 세 수집하는 "마무리 마크"의 병렬 소기 수집가의 버전입니다

CMS 수집기

원하는 포즈 콜렉터는 "마크 - 스윕"대 짧은 복구 시간 획득하는 주목하는 시스템에 응답하여, 알고리즘, B / S 체계

단계 :

  1. 초기 마크 (그리고 사용자 스레드가 함께 실행 시간이 걸리는 짧은) - GC의 뿌리에 직접 연결될 수있는 개체를 표시, 매우 빨리
  2. 동시 마크 (그리고 사용자 스레드가 함께 시간이 많이 걸리는 실행) - 동시 표시 단계는 GC RootsTracing을 수행, GC 참조 체인을 찾고
  3. 레이블이 재 지정 (사용자 스레드, 짧은 시간이 많이 걸리는 실행되지 않음) - 때문에 동시 사용자 스레드에 보정 기간을 표시하려면 표시 변경으로 이어질는 기록 마크를 생성
  4. 전체 메모리 영역을 스캔 - 동시 분명 (사용자 스레드가 함께 시간이 많이 걸리는 실행)

단점 :

  1. CPU 리소스에 매우 민감한 (장기간 동시 표시 단계, 사용자 쓰레드 CPU 시간을 차지)
  2. 부유 쓰레기를 처리 할 수 ​​없습니다 (동시 명확하고 사용자 스레드 동안 프로그램을 새로운 쓰레기 발생)
  3. 마크 - 우주 쓰레기의 청소 생성

G1 수집기

서버 애플리케이션 가비지 수집기 인 지역> 기억 된 세트 (순환 참조 해결)
(기준 기록 동작 프로그램 타입 기준 참조 타입 확인) 참조 확인 단계 :

  1. 초기 라벨 - 객체 태그에 직접 연결할 수 있습니다 GC 뿌리
  2. 동시 표시 - 라이브 개체를 식별하기 위해 GC 루트 도달 가능성 분석에서 오브젝트를 힙하기 시작,이 단계는 시간이 오래 걸리지 만 사용자 프로그램의 실행에 의해 복잡 할 수있다
  3. (SET 로그 - 기억 된> 설정 기억 된) 최종 마크 - 동시 표시시 수정으로 인해 발생하는 기록 마크의 부분에 표시 변경되었다 사용자 프로그램의 계속적인 동작으로, 가상 머신은 개체 변경 스레드 기억 된 세트 로그 내측이 기간에 기록되며, 최종 단계에서 기억 된 설정으로 기억 된 설정 로그 데이터를 병합 할 필요를 표시
  4. 재활용 (라이브 데이터가 계산 및 피난) 필터 - 만 기억 된 설정 스캔해야
    장점 :
  5. "새로 고침 태그"주와 지역에 따라 - 복제 알고리즘의 사용 사이
  6. 예측 일시 정지, 일시 정지 시간이 단축되지만 떨어져 낮은 일시 정지의 추구에서 G1은 일시 정지 시간 모델은 예측 설정할 수 있습니다
  7. 직접 지역을 재활용 자바 힙에 G1은 (신생대 세, 그들은이 지역의 일부가 더 이상 물리적으로 분리 없음)
  8. 예측 가능한 휴지 시간 모델, G1은 허용 각 수집 시간에 따른 우선 순위리스트를 유지하는 백그라운드 가비지 누적 값 크기 내부 개별 영역을 (공간 회수 및 재활용이 필요한 경험 시간을 얻음) 추적 우선 복구 값이 가장 큰 지역

힙 메모리 할당

Java 힙 유통

할당 규칙 객체 :

  1. 차세대 에덴 분할 영역의 주된 목적 (영역 에덴 다음 영역에서 대상 영역에 복사 회수 구역으로부터의 영역 면적 영역 에덴에 라이브 객체를 복사하고, 다음 가비지 컬렉션)
  2. 당신이 스레드 로컬 버퍼 할당을 시작하면, 우선 순위는 스레드 TLAB에 할당됩니다
  3. 드문 경우에 따라서는 직접 (에서와 이전 연도의 영역에 직접 맞게) 이전 연도에 할당 할 수있다

대형 객체 할당

대형 객체가 자바 객체가 연속 메모리 공간이 많이 필요하고, 가장 일반적으로는 큰 개체의 종류는 긴 문자열과 -XX의 배열입니다 : PretenureSizeThreshold 설정 개체가 에덴 영역에서 이전 시대에 직접 할당 된 값보다 크고 피 메모리 복제의 많은 두 Survivior 지역 사이에 발생

분배 스택과 탈출의 분석

분석 탈출 : 동적 범위를 분석 대상 객체가 상기 방법에 정의되는 경우,이 방법 이스케이프라는 외부 방법에 의해 참조 될 수있다. 그것은 심지어 다른 스레드에 의해 액세스 변수 나 클래스 인스턴스 변수 할당과 같은 외부 스레드 접근 할 수있다,라는 스레드 탈출. 프로세스 변수와 객체를 직접 자동으로 방법, 가비지 컬렉터가함으로써 시스템 성능 -XX을 향상 개입을 필요로하지 않습니다 완료 후 파괴, 스택에 할당 : 스택에 할당 + DoEscapeAnalysis 개방 이스케이프 분석 (기본적으로 jdk1.8) - XX : -DoEscapeAnalysis 가까운 탈출 분석

명령

  1. 추신 -ef | 그렙 자바
  2. JPS의 -m (시작 매개 변수) -l (클래스 이름) -v (JVM 매개 변수)
  3. 다양한 상태 정보를 실행 그러면 jstat -gc 27660 (250) (20) 모니터 가상 머신
  4. 27,660있는 jinfo보기 프로세스 가상 머신을 조정 (표시되지 지정) 파라미터 정보
  5. jmap는 원시 힙 덤프 스냅 샷 -XX : + HeapDumpOnOutOfMemoryError
    jmap는 -heap 9366은,
    jmap은 -histo 9366 | 더, 힙 통계에 표시 객체는
    jmap의 -dump : 형식은 B, 파일 = = / 사용자 / mousycoder / 데스크탑 / 9366 a.bin 생성 덤프 파일
    -Xmx20m -XX : + HeapDumpOnOutOfMemoryError -XX : HeapDumpPath = / Users (사용자) / mousycoder / 데스크탑 /
    그래픽 분석 힙 /Users/mousycoder/Desktop/java_pid9783.hprof jhat를
    java.lang.String의 S WHERE에서 SELECT s.toString () ( s.value! = NULL && s.value.length> 1000 )
  6. jstack을 스냅 스레드 (스레드를 실행하는 각각의 가상 머신 내의 스택 수집 방법은, 메인 쓰레드 문제를 찾아내는 데 사용된다)
    를 수행하는 작업을 닫기 전에 shutdownHook
    jstack을 -l -F 강제 출력 PID

스레드 상태

  1. 새로운
  2. RUNNABLE
  3. 이러한 상태에서 차단 모니터 스레드 수동 대기 차단 BLOCKED (엔트리 세트)
  4. 대기가이 상태에서 차단 된 스레드의 특정 작업을 수행하는 다른 스레드를 위해 무기한 대기 이니셔티브 명시 적으로 응용 프로그램 (설정을 기다립니다)
  5. TIMED_WAITING는 제한이 상태에서 작업 스레드를 수행하는 다른 스레드을 기다리고 있습니다
  6. TERMINATED 스레드는 큐션를 완료

JConsole의

영상 감시, 관리 도구 JMX 열린 포트 nohup을 자바 -Xms800m -Xmx800m -Djava.rmi.server.hostname = 192.168.1.250 -Dcom.sun.management.jmxremote.port = 1,111 -Dcom.sun.management.jmxremote을 JMX 기반. SSL = 거짓 -Dcom.sun.management.jmxremote.authenticate = 거짓 -jar HC-충 server.jar &

인터넷 개발 프로세스 JConsole의 메모리 분석적 사고 과정

FullGC

마이너 GC : 에덴의 영역이 가득 차면, 마이너 GCFullGC를 트리거 :

  1. -XX으로, 전체 GC 가상 머신을 권장으로 System.gc ()를 호출 : RMI는 ()으로 System.gc + DisableExplicitGC를 16 진수 호출
  2. 바로 이전 시대에 큰 개체를위한 공간의 올드의 부족, 공간이 여전히 전체 GC의 구현 후 불충분 이전 시대에 수명이 긴 개체, 다음 OutOfMemoryError가를 걸려, 위의 이유를 피하기 위해 전체 GC는 발생 가능한 멀리 튜닝 개체를 만들 때 다중의 새로운 세대의 객체가 얼마 동안 생존하고 너무 큰 객체와 배열을 작성하지 않도록 마이너 GC의 단계는 복구
  3. 복사 알고리즘 마이너 GC 메모리 공간을 사용하여 공간 할당을 보장 실패는 실패가 HandlePromotionFailure 보증을 발생하는 경우, 전체 GC의 트리거, 나이에 대한 담보로 필요한
    제안 :
  4. -Xmx 소형화, 시간 단축 GC (큰 힙 메모리가 제공되고, 긴 시간 전체 GC 휴지 시간은 더 길어질 수)
  5. 클러스터 배포

인터넷 문제

  1. 화이트리스트 문제
    해결 (용액의 소량이 동일하지 않은 큰 사용자 및 사용자 시스템) list.contain-> set.contain-> 블 필터
  2. 교착 상태
    해결 방법 : jstack을 새로운 스레드 이름을 가지고
  3. 힙 메모리 누수
    FullGC 1 ~ 2 배 하루의 정상 주파수 표시
    솔루션 : jmap는, 힙 움 +에 덤프 jhat를
  4. 힙 외부 메모리 누수
    힙 힙 사용이 매우 낮지 만 OOM 및 전체 GC가
    해결 : btrace

공부 팁

  1. 지식 시스템
  2. 인터뷰 일견 지식지도를하기 전에
  3. 승리 주장

추천

출처juejin.im/post/5d91972ae51d457825210a50