인터뷰에서 JVM을 통해 강점을 보여주는 방법

인터뷰에서 JVM은 필수입니다. 약 3 년의 경력을 가진 주니어 개발의 경우,이 기사에 주어진 패턴을 따르고 이러한 질문에 질서있게 대답하면 면접관은 확실히 당신이 매우 경험이 많다고 생각할 것입니다.

먼저 JVM의 기본 문제를 살펴 보겠습니다.

1. jdk 공간의 메모리 분할은 무엇입니까?

Jdk1.7 힙 공간은 다음과 같이 나뉩니다.

Jdk1.8 힙 공간은 영구 생성을 위해 취소되고 메타 공간으로 변경됩니다.

2. GC의 재활용 과정은 무엇입니까?

전체 GC 프로세스에서 처리해야 할 가장 중요한 것은 신세대 및 구세대의 메모리 정리 작업이며 메타 공간 (영구 생성)은 GC 범위 내에 있지 않습니다.

지금 새 객체가 생성되면 객체에 메모리 공간이 필요합니다. 평균적으로 각 스택 메모리는 4k를 저장하고 각 힙 메모리는 8k를 저장하므로 객체는 힙 공간을 적용해야합니다.

먼저 Eden 영역에 메모리 공간이 있는지 확인하고, 이때 메모리 공간이 있으면 새 객체가 Eden 영역에 직접 저장됩니다.

하지만 이때 Eden Park에 메모리가 부족하면 Minor GC 작업이 자동으로 실행되어 Eden Park에서 쓸모없는 메모리 공간을 정리합니다. Minor GC의 정리 범위는 Eden Park에만 있습니다. 청소, Eden Park의 기억 공간이 적절한 지 계속 판단 할 것입니까? 메모리 공간이 충분하면 새 개체가 Eden 캠퍼스에 직접 할당됩니다.

Minor GC 실행 후에도 Eden Park의 메모리 공간이 부족하면 이때 생존 영역이 판정되고, 생존 영역에 남은 공간이 있으면 Eden Park의 일부 활성 오브젝트가 저장됩니다. 에덴 파크의 기억 공간을 계속 결정하고, 기억 공간이 충분한 지, 충분한 지 여부에 따라 새로운 개체는 Eden 캠퍼스에 직접 할당됩니다.

이때 생존 지역에 기억 공간이 없다면 계속해서 구 지역을 판단한다. 살아남은 개체의 일부는 노년기에 저장되고 생존 영역에 여유 공간이 있습니다.

이때 구세대가 가득 차면 이때 Major GC (Full GC)가 생성되고 이때 구세대가 정리됩니다.

이전 세대에서 Full GC를 실행 한 후 객체를 저장할 수없는 경우 OOM 예외 또는 OutOfMemoryError 예외가 발생합니다.

3. StackOverflowError와 OutOfMemeryError의 차이점을 설명 해주세요.

이전 분석을 통해 실제로 각 메모리 블록에 변수 확장 영역의 일부가 있음을 알 수 있습니다. 기본 프로세스는 : ​​공간 메모리가 부족할 경우 변수 범위 내에서 메모리 공간을 확장하고, 그리고 일정 시간이 지나면 메모리가 충분하다는 것이 발견되어 메모리 공간을 줄입니다.

java 버전은 JDK1.8이지만 java EE 버전은 여전히 ​​jdk1.7이며 영구 생성은 힙 메모리에 있습니다.

메타 공간

메타 공간은 Jdk 1.8 이후에만 사용할 수 있습니다. 장치의 기능은 실제로 영구 생성과 동일합니다. 유일한 차이점은 영구 생성은 JVM의 힙 메모리 공간을 사용하고 메타 공간은 물리적 메모리를 사용한다는 것입니다. 메타 공간의 크기는 다음의 영향을받습니다. 로컬 메모리 영향은 일반적으로 기본적으로 약 2M입니다.

예 : 메타 스페이스 오류를 만들기 위해 일부 매개 변수 설정

자바 -XX : MetaspaceSize = 1m

4. JVM의 참조 유형은 무엇입니까?

참조 내부 유형 :

강력한 참조 : 메모리가 부족할 때 JVM은 OutOfMemoryError 오류와 함께 중지되지만 저장해야하며이 공간을 회수하지 않습니다. 기준 기간 동안 스택에 연결하면 재활용 할 수 없습니다.

소프트 참조 : 메모리가 부족하면 개체가 재활용되어 캐시에서 자주 사용됩니다. mybatis가 그중 하나입니다.

약한 참조 : 메모리가 부족한지 여부에 관계없이 쓰레기가있는 한 즉시 수집됩니다.

팬텀 따옴표 : 따옴표 없음과 동일

5. 가비지 콜렉션 기간의 일반적인 알고리즘에 대해 알려주십시오.

GC 알고리즘 :

참조 계수 방법 : 객체 A의 경우 한 번 참조하면 1 씩 증가하고 참조는 1 씩 무효화되며 계수가 0이면 무효화됩니다.

루트 검색 알고리즘 : 도달 가능 여부 판단 : 루트 노드와 종속성 관계가 있어야합니다. 내 GCroot와 관련이없는 경우

마크 클리어

마킹 지우기는 마킹과 지우기의 두 단계로 나뉩니다. 개체는 루트 노드에서 표시되고, 루트 노드에서 도달 할 수있는 개체는 표시되며, 표시되지 않은 개체는 지우기 단계에서 지워집니다.

마크 압축

개체가 살아 있는지 여부를 표시하고, 살아남은 개체를 이동하고, 이동 후 경계 외부의 개체를 정리합니다.

마크 제거를위한 마크 압축의 장점은 무엇입니까?

알고리즘 복사

6. JVM에 대한 이해에 대해 말씀해 주시겠습니까? Java 8 가상 머신의 업데이트는 무엇입니까?

답변 : 여기서 JVM이 자바 가상 머신이라고 말하지 않겠습니다. 자바 파일의 실행 과정에 대해 살펴 보겠습니다. *. java 파일은 컴파일러에 의해 바이트 코드 파일로 컴파일 된 다음 JVM 클래스에서로드되어 실행 엔진에 의해 실행됩니다. 이 기간 동안 클래스 로더가로드 한 데이터는 Java 런타임 데이터 영역과 상호 작용합니다. JVM 메모리는 클래스 로더, 실행 엔진, 로컬 메소드 인터페이스, 자바 런타임 데이터 영역으로 나뉘어있는 것 같습니다. 자바 런타임 데이터 영역은 프로그램 카운터, 가상 머신 스택, 로컬 메소드 스택, 힙, 메소드 영역으로 나뉩니다.

프로그램 카운터 : 현재 실행중인 스레드의 바이트 코드 주소를 가리키는 명령 또는 줄 번호. 스레드 개인에 속합니다.

가상 머신 스택 : 현재 스레드 실행 방법, 액세스 주소 (자바 고유)에 필요한 데이터 명령을 저장합니다.

Java 가상 머신 스택은 로컬 변수 테이블, 피연산자 스택, 동적 링크, 메소드 종료의 네 부분으로 나뉩니다.

로컬 메서드 스택 : 로컬 메서드 저장

메서드 영역 : 메서드 영역에는 정적 변수 + 클래스 정보 + 리터럴 상수 + 런타임 상수 풀이 포함됩니다.

힙 : 객체 생성은 힙 영역에서 이루어지며 JAVA의 GC는 주로이 영역에서 작동합니다.

힙 영역은 논리적으로 Cenozoic, Old 및 Permanent (java7)로 나뉩니다. Java8에서 힙은 논리적으로 Cenozoic, Old 및 Meta Space로 나뉩니다. 메타 공간의 기본 크기는 2M입니다. 왼쪽과 오른쪽, 신생대는 에덴 영역, 생존 영역으로 나뉘며, 생존 영역은 같은 크기 (즉, s0 영역, s1 영역)의 두 개의 메모리 공간으로 구성되며 영역에서 영역으로도 호출됩니다. 신세대와 구세대라는 두 가지 영역 만 있습니다. Java8 가상 머신 업데이트 : 메타 스페이스가 영구 생성으로 대체됩니다. 업데이트 이유는 무엇입니까? Oracle은 Sun의 Hotspot과 BEA의 Jrocket을 통합하여 영구 생성을 제거하고이를 메타 스페이스로 대체합니다. 영구 생성과 메타 스페이스의 차이점은 무엇입니까? 메타 공간은 Jdk1.8 이후에만 사용할 수 있습니다. 기능은 실제로 영구 생성과 동일합니다. 유일한 차이점은 영구 생성은 JVM의 힙 메모리 공간을 사용하고 메타 공간은 물리적 메모리를 사용하므로 메타 공간의 크기가 로컬 메모리 영향의 영향을받습니다.

메서드 영역과 영구 생성 간의 관계에 대해 이야기 해 보겠습니다. 메서드 영역은 UserService를 정의하고 영구 생성은 UserServiceImpl에 해당합니다. 인터페이스와 구현 클래스 간의 관계

StackOverflowError와 OutOfMemeryError의 차이점을 설명해주세요.

답변 : 일반적으로 너무 많은 재귀와 너무 많은 메서드 호출로 인해 StackOverflowError 스택 오버플로가 발생합니다.

OutOfMemeryError 힙 메모리 오버플로 또는 OOM은 GC에서 회수하지 않은 힙 메모리의 개체가 너무 많기 때문에 발생합니다.

7. JVM의 공통 매개 변수 조정에 대해 무엇을 알고 있습니까?

2 : 1Xms 힙 메모리 초기화 크기, 일반적으로 기본값은 실제 메모리의 64 분의 1입니다.

하나의 -Xmx 힙 메모리 최대 할당 공간, 일반적으로 기본적으로 실제 메모리의 1/4

 

그런 다음 JVM 질문에 대답하면 다음과 같이 확장합니다. 프로젝트에서 코딩 할 때 JVM의 효율성에주의를 기울이고 OOM 문제 해결에 더 많은 경험을 갖게 될 것입니다.

8 코딩 할 때 JVM 효율성에주의를 기울이는 방법은 무엇입니까?

1 String과 같은 불변 클래스를 자주 읽고 쓰지 않도록하세요. 예를 들어, String을 자주 읽고 쓰고 싶다면 StringBuild 또는 StringBuffer를 사용하세요.

2 메서드를 잘못 작성하여 개체를 재활용 할 수 없도록하기 위해 finalize 메서드를 작성하지 마십시오.

3 필요한 경우 약한 참조와 부드러운 참조를 사용합니다.

4 ArrayList와 같은 개체를 사용하여 즉시 지우고 Connection과 같은 개체를 사용하여 즉시 닫습니다.

9 OOM 문제를 해결하는 방법은 무엇입니까?

1 문제가 발생했을 때 덤프 파일을보고 그 당시의 메모리 미러링을 살펴 봅니다.

2 당시의 로그 파일을보십시오

위의 두 가지 점을 결합하면 일반적으로 물리적 인 물체가 해제되지 않는 등의 문제를 알 수 있습니다.

10 어떤 OOM 문제가 있었습니까?

1 ArrayList와 같은 객체는 사용 후 해제되지 않습니다.

2 물리적 개체가 사용되고 해제되지 않습니다.

3 멀티 스레딩에서 자주 개체 생성

 

추천

출처blog.csdn.net/sxeric/article/details/115303187