Java 인터뷰 고전 질문 분석 - Java 플랫폼에 대한 이해에 대해 이야기하십시오.

이미지.png
Java 개발에 대한 노출부터 지금까지 Java에 대한 가장 직관적인 인상은 무엇입니까? 광고하는 "한 번 컴파일, 어디에서나 실행"입니까, 아니면 지나치게 형식적인 구문입니까? Java 플랫폼에 대해 얼마나 알고 있습니까? 잠시 멈추고 생각하십시오.

오늘 제가 여러분에게 묻고 싶은 질문 은 Java 플랫폼에 대한 귀하의 이해에 대해 이야기하는 것입니다. "Java는 해석된 실행입니다", 이 문장이 맞습니까?

일반적인 답변

Java 자체는 객체 지향 언어입니다. 가장 주목할만한 기능은 두 가지 측면이 있습니다. 하나는 크로스 플랫폼 기능을 쉽게 얻을 수 있는 소위 "한 번 컴파일, 어디서나 실행"(한 번 컴파일, 어디서나 실행)입니다. 가비지 컬렉션(GC, Garbage Collection), 자바는 가비지 컬렉터(Garbage Collector)를 통해 메모리를 회수하고 할당하는데 대부분의 경우 프로그래머는 메모리 할당과 재활용에 대해 걱정할 필요가 없다.

우리는 매일 JRE(Java Runtime Environment) 또는 JDK(Java Development Kit)와 접촉하게 될 것입니다. Java Runtime Environment인 JRE에는 JVM 및 Java 클래스 라이브러리와 일부 모듈이 포함되어 있습니다. JDK는 컴파일러, 다양한 진단 도구 등과 같은 더 많은 도구를 제공하는 JRE의 상위 집합으로 볼 수 있습니다.

이 명령문은 "Java는 해석된 실행입니다"라는 명령문에 대해서는 덜 정확합니다. 우리가 개발한 Java의 소스 코드는 먼저 Javac에 의해 바이트 코드로 컴파일된 다음 런타임에 바이트 코드가 JVM(Java Virtual Machine)에 내장된 인터프리터에 의해 최종 기계 코드로 변환됩니다. 그러나 우리가 대부분의 경우 사용하는 Oracle JDK에서 제공하는 Hospot JVM과 같은 일반적인 JVM은 동적 컴파일러라고도 하는 JIT(Just-In-Time) 컴파일러를 제공합니다. JIT는 런타임에 핫스팟을 변환할 수 있습니다. 이 경우 일부 핫 코드는 해석 및 실행되지 않고 컴파일 및 실행됩니다.

테스트 포인트 분석

사실 이 질문은 좀 일반적입니다. 주제 자체는 매우 개방적이며 기본 지식이 명확한지 여부, Java 플랫폼의 주요 모듈 및 운영 원칙이 마스터되었는지 여부와 같은 여러 측면을 종종 검토합니다. 많은 면접관들이 이런 질문에 시달릴 것이고, 조금 긴장하고 어디서부터 시작해야 할지 몰라서 아주 간단한 대답을 합니다.

이러한 일반적인 질문에 대해서는 자신의 생각이 심도 있고 체계적이며 Java 지식이 더 포괄적임을 보여주기 위해 최선을 다해야 합니다. 그리고 이유를 모른다". 결국 기본 구성과 메커니즘을 이해하는 것은 일상 업무에서 문제 진단이나 성능 조정과 같은 많은 것의 기초입니다.어떤 채용 담당자도 "배우고 생각하는 것을 좋아하는" 면접관을 싫어하지 않을 것이라고 믿습니다.

답변이 완벽하지 않더라도 걱정하지 마십시오. 저는 개인적으로 이런 일반적인 질문에 조금은 일방적으로 대답하는 것이 정상이라고 생각합니다. 일반적으로 면접관을 안내하고 그의 진면목을 보여주려고 노력합니다. 이러한 종류의 질문은 오프닝 워밍업이며 면접관은 종종 귀하의 답변을 기반으로 관련 질문을 확장합니다.

지식 확장

주제로 돌아가서 다음과 같은 여러 측면에서 Java 플랫폼에 대한 이해에 대해 간략하게 이야기할 수 있습니다. , 보안 및 기타 기본 클래스 라이브러리. 일상 업무에서 많이 사용되는 수업 라이브러리의 경우 면접 전에 체계적으로 정리할 수 있어 현장에서 플레이하는 데 도움이 됩니다.

또는 Java의 클래스 로딩 메커니즘, 부트스트랩, 애플리케이션 및 확장 클래스 로더와 같은 JDK의 공통 버전(예: JDK 8)에 포함된 클래스 로더와 같은 JVM의 기본 개념 및 메커니즘에 대해 이야기하십시오. 클래스 로딩: 로딩, 검증, 링크, 초기화(여기서는 훌륭한 JVM 입문서인 Zhou Zhiming의 "In-depth Understanding of Java Virtual Machine" 참조), 커스텀 클래스 로더 등 가비지 수집의 기본 원칙도 있는데 SerialGC, Parallel GC, CMS, G1 등 가장 일반적인 가비지 수집기는 어떤 작업 부하에 적합한지 잘 알고 있습니다. 이것들은 모두 확장할 수 있는 영역이며 이후 칼럼에서 보다 체계적으로 소개하겠습니다.

물론 컴파일러, 런타임 환경, 보안 도구, 진단 및 모니터링 도구 등과 같은 Java 분야의 다른 도구 또는 JDK에 포함된 도구는 무엇입니까? 이러한 기본 도구는 일상 업무의 효율성을 보장하며 다른 언어 플랫폼에서 작업하는 데에도 도움이 됩니다.

아래 그림은 참조용으로 요약한 비교적 광범위한 청사진입니다.

이미지.png

더 이상 확장하지 않고 실행 해석 및 실행 컴파일에 대해 이전에 묻는 질문으로 돌아갑니다. 일부 면접관은 특정 질문에 대해 "본문으로 가기"를 좋아합니다. 왜냐하면 그것이 면접 대상자의 지식에 대해 더 많이 배울 수 있는 효과적인 방법이기 때문입니다. 저는 조금 더 깊이 들어갈 것입니다.

우리 모두 알고 있듯이 우리는 일반적으로 Java를 컴파일 시간과 런타임으로 나눕니다. 여기서 언급한 자바 컴파일과 C/C++는 다른 의미를 가지고 있는데 자바 소스 코드를 컴파일하여 ".class" 파일을 생성하는 자바 컴파일은 실제로 직접 실행 가능한 기계어 코드가 아니라 바이트 코드이다. Java는 바이트코드의 교차 플랫폼 추상화와 "한 번 컴파일, 모든 곳에서 실행"을 실현하는 기반이 되는 JVM(Java Virtual Machine)을 통해 운영 체제 및 하드웨어의 세부 정보를 보호합니다. 여기에서는 모든 사람에게 아키텍처 학습 교환 서클을 추천합니다. 커뮤니케이션 스터디 가이드 Pseudo Xin: 1253431195(인터뷰 질문과 답변이 많이 있음), 선임 아키텍트가 녹화한 일부 비디오 녹화 공유: Spring, MyBatis, Netty 소스 코드 분석, 높은 동시성, 고성능, 분산형, 마이크로서비스 아키텍처 JVM 성능 최적화의 원리, 분산 아키텍처 등은 건축가에게 필요한 지식 시스템이 되었습니다. 현재 많은 혜택을 받고 있는 무료 학습 자료도 받을 수 있습니다.

런타임에 JVM은 클래스 로더를 통해 바이트 코드를 로드하고 실행을 위해 이를 해석하거나 컴파일합니다. 앞서 언급했듯이 JDK 8과 같은 주류 Java 버전은 실제로 혼합 해석 및 컴파일 모드, 이른바 혼합 모드(-Xmixed)입니다. 일반적으로 서버 모드에서 실행되는 JVM은 효율적인 컴파일을 위해 충분한 정보를 수집하기 위해 수만 번의 호출을 수행하며 클라이언트 모드의 임계값은 1500배입니다. Oracle Hotspot JVM에는 2개의 서로 다른 JIT 컴파일러가 내장되어 있는데, C1은 위에서 언급한 클라이언트 모드에 해당하여 일반 Java 데스크탑 애플리케이션과 같이 시작 속도에 민감한 애플리케이션에 적합하고 C2는 서버 모드에 최적화되어 있습니다. 장기 실행 서버 최종 애플리케이션 설계. 기본값은 소위 계층화된 컴파일(TieredCompilation)을 사용하는 것입니다. 여기서 JIT에 대한 자세한 내용은 다루지 않겠습니다. 한 번에 모두 다룰 필요는 없습니다. 계층화된 컴파일의 내용은 나중에 소개하겠습니다.

Java 가상 머신이 시작되면 다른 매개변수를 지정하여 실행 모드를 선택할 수 있습니다. 예를 들어, "-Xint"를 지정하면 JVM이 코드를 컴파일하지 않고 코드만 해석하고 실행하도록 지시합니다. 이 모드는 JIT가 가져올 수 있는 성능 이점을 포기합니다. 결국 인터프리터는 항목별로 읽고 항목별로 해석하고 실행합니다. 이에 따라 JVM에 인터프리터를 닫고 해석 실행을 수행하지 않거나 최대 최적화 수준을 지시하는 "-Xcomp" 매개변수도 있습니다. 그러면 이 모드가 가장 효율적인지 물어볼 수 있습니다. 간단히 말해서 실제로는 아닙니다. "-Xcomp"는 JVM을 매우 느리게 시작하도록 합니다. 동시에 분기 예측과 같은 일부 JIT 컴파일러 최적화 방법은 프로파일링이 수행되지 않으면 효과적으로 최적화할 수 없는 경우가 많습니다.

일상 생활에서 가장 일반적인 Java 사용 패턴 외에도 실제로 바이트 코드를 기계 코드로 직접 컴파일하여 JIT 워밍업을 피하는 소위 AOT(Ahead-of-Time Compilation)라는 새로운 컴파일 방법이 있습니다. 등. Oracle JDK 9의 실험적 AOT 기능 도입 및 새로운 jaotc 도구 추가와 같은 다양한 오버헤드. 다음 명령을 사용하여 클래스 또는 모듈을 AOT 라이브러리로 컴파일하십시오.

jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base

그런 다음 시작할 때 직접 지정할 수 있습니다.

java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

또한 Oracle JDK는 계층화된 컴파일 및 AOT 협업 사용을 지원하며, 이는 둘 중 하나를 선택할 수 없습니다. AOT가 유일한 방법은 아닙니다. 업계에서는 오랫동안 관련 기능을 제공하는 타사 도구(예: GCJ, Excelsior JET)를 사용해 왔습니다.

또한 JVM은 강력한 플랫폼으로서 JVM에서 실행될 수 있는 Java 언어일 뿐만 아니라 본질적으로 호환되는 바이트코드도 포함하고 있습니다. Java 언어 자체도 이를 위한 편의를 제공합니다. Clojure 및 Scala와 같은 유사점을 볼 수 있습니다. , Groovy , JRuby, Jython 및 기타 여러 JVM 언어가 다양한 시나리오에서 활성화됩니다.

오늘은 Java 언어 기능, 코어 클래스 라이브러리 및 일반적으로 사용되는 타사 클래스 라이브러리, Java 가상 머신의 기본 원리 및 관련 도구를 포함하여 전반적인 인상을 구축하기 위한 목적으로 Java 플랫폼과 관련된 몇 가지 내용을 간략하게 소개했습니다. 도움이 됩니다.

추천

출처blog.csdn.net/m0_54828003/article/details/127240601