자바 jvm 지식 상세 소개

5040 단어 자바jvm
자바 jvm 상세 설명:
jvm 에 대한 지식
메모리
1.jvm 의 스 택 메모리 에는 기본 형식의 변수 와 대상 의 참조 가 저장 되 어 있 습 니 다.
2.jvm 의 메모 리 는 주로 new 로 만 든 대상 과 배열 을 저장 합 니 다.가 변 긴 문자열(StringBuilder 와 StringBuffered)은 모두 메모리 에 저 장 됩 니 다.
더미 의 장점 은 동적 으로 저장 공간 을 분배 하고 더욱 유연 하 다 는 것 이다.그러나 단점 은 동적 으로 메모 리 를 분배 해 야 하기 때문에 저장 속도 가 비교적 느리다 는 것 이다.스 택 을 사용 하 는 속도 가 비교적 빠 르 고 데이터 의 공 유 를 실현 할 수 있 지만 스 택 의 데이터 크기 와 생존 기간 은 반드시 확정 되 어야 하고 유연성 이 부족 하 다 는 것 이 단점 이다.
3.정적 저장 소 분 배 는 정적 변수 와 정적 코드 블록 을 저장 하 는 것 입 니 다.
jvm 인식
jvm 즉 자바 가상 머 신 은 구체 적 인 운영 체제 플랫폼 과 관련 된 정 보 를 차단 하여 자바 프로그램 이 자바 가상 머 신 에서 실행 되 는 목표 코드(바이트 코드)만 생 성하 면 크로스 플랫폼 운행 을 실현 할 수 있 습 니 다.
그 원 리 는 자바 소스 파일 이 자바 컴 파일 러 를 통 해 바이트 코드 프로그램 으로 컴 파일 되 고 jvm 을 통 해 모든 명령 을 서로 다른 플랫폼 의 기계 코드 로 번역 하여 특정한 플랫폼 을 통 해 실행 하 는 것 이다.
jvm 의 메모리 영역 은 주로 방법 구역,jvm 스 택,더미,로 컬 방법 스 택,프로그램 카운터 로 나 뉜 다.
프로그램 카운터:현재 실 행 된 명령 을 기록 하 는 데 사 용 됩 니 다.이것 은 oom 상황 이 없 는 유일한 구역 입 니 다.
jvm 스 택:스 레 드 개인,모든 스 레 드 를 만 드 는 동시에 jvm 스 택 을 만 듭 니 다.현재 스 레 드 의 부분 적 인 기본 변수,부분 반환 결과 와 stack frame,그리고 대상 의 참조 주 소 를 저장 합 니 다.
더미:스 레 드 공유,일부 대상 과 배열 을 저장 하 는 데 사용 합 니 다.공유 하 는 이상 자 물 쇠 를 추가 해 야 하기 때문에 비용 이 많이 든다.
방법 구역:이 방법 구역 은 지구 대 에 대응 합 니 다.클래스 의 정보(이름,수정자 등),클래스 의 정적 변수,클래스 에서 final 로 정의 하 는 상수 등 을 저장 합 니 다.
로 컬 방법 스 택:native 방법의 실행 을 지원 하고 모든 native 방법의 호출 상 태 를 저장 합 니 다.
자바 쓰레기 수 거 는 주로 쌓 기와 방법 구역 을 대상 으로 합 니 다.쌓 기 는 신세대 와 옛날 로 나 뉘 는데 보통 new 에서 나 온 대상 은 신세대 에 넣 습 니 다.그리고 신 생 대 는 Eden 구역 과 두 개의 Survivor 구역 으로 나 뉜 다.
쓰레기 회수 메커니즘 은 먼저 어떤 대상 이 쓰레기 인지,즉 더 이상 사용 되 지 않 는 지 판단 한 다음 에 해당 하 는 알고리즘(표기-제거 알고리즘,복제 알고리즘,표기-정리 알고리즘,세대 별 수집 알고리즘)을 이용 하여 쓰레기 를 회수 하 는 것 이다.
1.태그-제거 알고리즘:
두 단계 로 나 뉘 어 단계 와 제거 단 계 를 표시 하고 먼저 회수 해 야 할 대상 을 표시 한 다음 에 표지 대상 이 차지 하 는 공간 을 회수 합 니 다.

 
 그것 의 실현 은 비교적 간단 하지만 단점 은 메모리 조각 이 쉽게 생 겨 서 나중에 큰 대상 에 게 공간 을 분배 해 야 할 때 충분 한 메모 리 를 찾 지 못 해 새로운 쓰레기 회수 동작 을 미리 촉발 하 는 것 이다.
2.복제 알고리즘:
복사 알고리즘 은 태그-알고리즘 의 단점 을 해결 하기 위해 메모 리 를 용량 에 따라 크기 가 같은 두 개의 구역 으로 나 누고 매번 그 중의 한 조각 만 사용 합 니 다.한 조각 을 다 쓴 후에 살아 있 는 대상 을 다른 구역 으로 복사 한 다음 에 사용 한 구역 을 제거 하면 조각 이 쉽게 나 오지 않 습 니 다.


메모리 파편 문 제 를 해 결 했 지만 사용 한 메모 리 를 원래 의 절반 으로 줄 이 고 복사 하 는 효율 은 살아 남 은 대상 의 수량 과 관련 이 있 으 며 수량 이 많 을 때 효율 이 크게 떨어진다 는 것 이 단점 이다.
3.태그-정리 알고리즘
복제 알고리즘 의 결함 을 해결 하기 위해 표기-정리 알고리즘 이 탄생 하고 표기 단계 도 표기-제거 알고리즘 과 마찬가지 로 회수 해 야 할 대상 을 먼저 표시 하지만 직접 회수 하 는 것 이 아니 라 살아 있 는 대상 을 다른 쪽으로 이동 시 킨 다음 경계 밖의 메모 리 를 제거한다.


4.세대 별 수집 알고리즘
이것 은 현재 가장 많이 사용 되 는 알고리즘 이다.그의 핵심 사상 은 대상 의 생존 주기 에 따라 메모리 를 여러 개의 서로 다른 구역 으로 나 누 는 것 이다.일반적인 상황 에서 쌓 인 구역 을 신세대 와 옛날 로 나 누 는 것 이다.옛날 시대 의 특징 은 쓰레기 를 회수 할 때마다 회수 해 야 하 는 이미지 가 비교적 적 고 신세대 가 비교적 많 기 때문에 서로 다른 알고리즘 을 사용 하 는 것 이다.
현재 신세대 들 은 대부분 복제 알고리즘 을 사용 하지만 실제 적 으로 1:1 의 비율 로 신세대 의 공간 을 구분 하 는 것 이 아니다.일반적으로 신 생 대 를 비교적 큰 Eden 공간 과 두 개의 작은 Survivor 공간 으로 나 누 는데 Eden 공간 과 그 중의 한 개의 Survivor 공간 을 사용 할 때마다 회수 할 때Eden 과 Survivor 에서 살아 있 는 대상 을 다른 Survivor 공간 으로 복사 한 다음 Eden 과 방금 사 용 했 던 Survivor 공간 을 제거 합 니 다.
옛날 에는 회수 할 때마다 소량의 대상 만 회수 하 는 것 이 특징 이 었 기 때문에 일반적으로 표기-정리(Mark-Compact)알고리즘 을 사용 했다.
주의 하 세 요.쌓 인 구역 외 에 또 하나의 세 대 는 영구적 인 세대(Permanet Generation)입 니 다.이것 은 class 류,상수,방법 설명 등 을 저장 하 는 데 사 용 됩 니 다.영구 세대 에 대한 회 수 는 주로 두 부분 을 회수 하 는데 그것 이 바로 폐기 상수 와 쓸모없는 종류 이다.
그렇다면 우 리 는 어떤 대상 이 쓰레기 인지 어떻게 확정 합 니까?
방법 1.인용 계수 법:
자바 에 서 는 인용 을 통 해 대상 과 연 결 됩 니 다.즉,대상 을 조작 하려 면 인용 을 통 해 진행 해 야 합 니 다.간단 한 방법 은 인용 수 를 통 해 대상 이 회수 되 는 지 여 부 를 판단 하 는 것 이다.일반성 을 잃 지 않 고 한 대상 이 인용 과 관련 이 없다 면 이 대상 이 다른 곳 에서 거의 사용 되 지 않 는 다 는 것 을 의미한다.그러면 이 대상 은 회수 가능 한 대상 이 된다.이런 방식 은 인용 계수 법 이 된다.
장점:실현 이 간단 하고 효율 이 높다.
단점:반복 참조 문 제 를 해결 할 수 없습니다.
방법 2.접근 성 분석 법:
이 방법의 기본 사상 은 일련의'GC Roots'대상 을 기점 으로 검색 하 는 것 이다.만약 에'GC Roots'와 한 대상 사이 에 도달 할 수 있 는 경로 가 없다 면 이 대상 은 도달 할 수 없다 고 하 는 것 이다.그러나 주의해 야 할 것 은 도달 할 수 없다 고 판 정 된 대상 이 반드시 회수 대상 이 되 는 것 은 아니다.불가 능 판정 을 받 은 대상 이 회수 가능 대상 이 되 려 면 최소 두 번 의 표기 과정 을 거 쳐 야 하 며,이 두 번 의 표기 과정 에서 도 회수 가능 대상 이 될 가능성 을 벗 어 나 지 않 으 면 기본적으로 진짜 회수 가능 대상 이 된다.
어떤 대상 이 GC Roots 가 될 수 있 습 니까?
1.jvm 스 택(스 택 프레임 의 로 컬 변수 표)에서 인용 한 대상.
2.방법 영역 에서 정적 속성 참조 대상 입 니 다.
3.방법 영역 에서 상수 참조 대상
4.로 컬 방법 스 택 에서 JNI(즉,일반적으로 Native 방법)가 인용 한 대상.
프로그래머 에 게 있어 서 우 리 는 몇 가지 방법 을 통 해 GC 비용 을 줄 일 수 있다.
1.System.gc()방법 을 표시 하지 않 고 호출 합 니 다.
2.임시 대상 의 사용 을 최소 화
3.대상 이 사용 하지 않 을 때 표시 지 를 null 로 설정
4.String 누적 문자열 대신 StringBuilder 를 사용 합 니 다.
5.기본 유형의 변수(int long)를 사용 할 수 있 으 면 대상(Integer,Long)을 사용 하지 마 십시오.
6.정적 대상 변 수 를 적 게 사용
 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기