이 글에서는 주로 JVM(Java Virtual Machine) 관련 내용과 Java 프로그램의 실행 메커니즘 및 오류 분석을 소개합니다.
JVM(Java Virtual Machine) 다양한 방식(소프트웨어 또는 하드웨어)으로 구현할 수 있는 컴퓨팅 장치에 대한 사양입니다. 가상 머신용 명령어 세트를 컴파일하는 것은 마이크로프로세서용 명령어 세트를 컴파일하는 것과 매우 유사합니다. JVM(Java Virtual Machine)에는 바이트코드 명령어 세트, 레지스터 세트, 스택, 가비지 수집 힙 및 저장 방법 필드가 포함되어 있습니다.
JVM(Java Virtual Machine)은 Java 코드를 실행할 수 있는 가상의 컴퓨터입니다. 인터프리터가 JVM 사양에 따라 특정 컴퓨터로 이식되는 한 컴파일된 모든 Java 코드는 해당 시스템에서 실행되도록 보장될 수 있습니다.
1. Java 가상 머신을 사용하는 이유
Java 언어의 매우 중요한 특징은 플랫폼으로부터의 독립성입니다. 이 기능을 달성하려면 Java 가상 머신을 사용하는 것이 핵심입니다. 일반적인 고급 언어를 다른 플랫폼에서 실행하려면 최소한 다른 타겟 코드로 컴파일해야 합니다. Java 언어 가상 머신이 도입된 이후에는 다른 플랫폼에서 실행될 때 Java 언어를 다시 컴파일할 필요가 없습니다. Java 언어 사용 모델 Java 가상 머신은 특정 플랫폼과 관련된 정보를 보호하므로 Java 언어 컴파일러는 Java 가상 머신에서 실행되는 대상 코드(바이트코드)만 생성하면 되며 수정 없이 여러 플랫폼에서 실행할 수 있습니다. JVM(Java Virtual Machine)은 바이트코드를 실행할 때 바이트코드를 특정 플랫폼에서 실행하기 위한 기계 명령어로 해석합니다.
Java 실행 메커니즘
Java 프로그램 실행은 쓰기, 컴파일, 실행의 세 단계를 거쳐야 합니다.
작성이란 Java 개발 환경에서 프로그램 코드를 입력하고 최종적으로 .java라는 접미사를 붙여 Java 소스 파일을 만드는 것을 의미합니다.
컴파일이란 소스 파일 문제를 해결하기 위해 Java 컴파일러를 사용하는 프로세스를 의미합니다. 컴파일 후에는 최종적으로 실행 파일을 생성하는 C 언어와 달리 접미사 .class가 붙은 바이트코드 파일이 생성됩니다.
실행이란 Java 인터프리터를 사용하여 바이트코드 파일을 기계어 코드로 변환하고 실행하여 결과를 표시하는 것을 의미합니다.
바이트코드 파일은 특정 기계 환경 및 운영 체제 환경과 관련이 없는 중간 코드입니다. 바이너리 파일은 자바 소스 파일이 자바 컴파일러에 의해 컴파일된 후 생성된 객체 코드 파일입니다. 프로그래머나 컴퓨터 모두 바이트코드 파일을 직접 읽을 수는 없으며 전용 자바 인터프리터에 의해 해석되고 실행되어야 합니다. 따라서 자바는 컴파일을 기반으로 해석되고 실행되는 언어입니다.
Java 인터프리터는 특정 하드웨어 환경 및 운영 체제 플랫폼에서 실행을 위해 바이트코드 파일을 기계어 코드로 변환하는 역할을 담당합니다. 따라서 Java 프로그램은 기존 운영 체제 플랫폼에서 직접 실행할 수 없으며 Java Virtual Machine이라는 소프트웨어 플랫폼에서 실행되어야 합니다.
JVM(Java Virtual Machine)은 Java 프로그램을 실행하기 위한 소프트웨어 환경이며 Java 인터프리터는 Java Virtual Machine의 일부입니다. Java 프로그램을 실행하면 JVM이 먼저 시작된 다음 Java 바이트코드를 해석하고 실행하는 역할을 담당하며 Java 바이트코드는 JVM에서만 실행할 수 있습니다. 이러한 방식으로 JVM을 사용하면 특정 하드웨어 플랫폼 및 운영 체제 환경에서 Java 바이트코드 프로그램을 분리할 수 있습니다. 하드웨어 플랫폼과 운영 체제 환경은 바이트코드 파일이 생성된 플랫폼을 고려할 필요가 없습니다. JVM은 서로 다른 소프트웨어와 하드웨어 플랫폼 사이의 특정 차이점을 숨겨 진정한 바이너리 코드 수준의 크로스 플랫폼 이식을 달성합니다. JVM은 Java의 플랫폼 독립적인 기반입니다. Java의 크로스 플랫폼 기능은 JVM에서 Java 프로그램을 실행하여 달성됩니다.
Java 언어의 "한 번 작성하면 어디서나 실행" 접근 방식은 대부분의 최신 고급 프로그래밍 언어가 서로 다른 시스템에 대해 서로 다른 기계어 코드를 생성하기 위해 컴파일해야 하는 문제, 즉 하드웨어의 이기종 문제를 효과적으로 해결합니다. 환경 및 운영 플랫폼을 통해 프로그램 개발, 유지 관리 및 관리에 따른 오버헤드를 크게 줄일 수 있습니다.
Java 프로그램은 JVM을 통해 크로스 플랫폼 기능을 구현할 수 있지만 JVM은 크로스 플랫폼이 아닙니다. 즉, 서로 다른 운영 체제의 JVM은 Windows 플랫폼의 JVM을 Linux에서 사용할 수 없으며 그 반대의 경우도 마찬가지입니다.
오류 분석을 실행하는 JAVA 프로그램
일반적으로 가동 중인 대규모 프로젝트에서는 기껏해야 다음과 같은 문제가 발생할 수 있습니다.
1. 비정상적인 CPU 사용량
1) 확인 CPU 사용량, 대상 프로세스의 사용량, 그리고 각 코어의 사용량을 살펴보세요. 단일 스레드 문제인지 스레드 풀 문제인지 찾는 데 도움이 될 수 있습니다.
2) 가끔 프로그램이 일정 시간 동안 정상적으로 실행되었다가 갑자기 CPU가 수직으로 올라가는 경우가 있는데, 이는 프로그램의 잠금 현상과 관련이 있을 수 있습니다(잠금 시간이 짧은 경우에는 더 좋습니다). cas+yield를 시도하여 스핀 잠금 구현)
3) 교착 상태가 발생하는 경우 호출 스택을 직접 내보내 문제에 대한 해결책을 찾습니다.
2. 비정상적인 메모리
1) 메모리 누수, 말할 것도 없이 스택을 덤프하여 문제를 찾아보세요
2) 잦은 GC도 성능 저하로 이어질 수 있습니다. 프로그램에서 GC가 자주 발생하는 경우, 새로운 세대의 크기를 늘려도 문제가 해결되지 않으면 주의해야 합니다. 임시 개체 생성(메모리의 반복 적용을 방지하기 위해 개체 풀 기술을 사용할 수 있음)
3. 특정 작업자 스레드의 예기치 않은 종료
4. 비정상적인 IO
1) 열린 파일 확인, IO 작업 점유, 디스크 사용량. df iostat 등의 명령어를 사용하면 됩니다.
2) 모니터링 및 네트워크 사용량을 점유하는 프로그램이 있는지 확인하려면 netstat 등의 명령어를 사용하면 됩니다.
도구를 사용하여 오류 분석
1 .jmap
jmap pid 기본적으로 JAVA 보기 프로세스 내 메모리 사용량 관련 정보
jmap -histo pid 메모리의 활성 인스턴스 수 확인
jmap -dump:format=b,file=(file 이름) pid 자바 프로그램 메모리를 완전히 내보냅니다. 전체 분석은 3가지 과정으로 나누어 프로그램 초기화 후 jmap -dump:format=b,file=a.bin을 1회 실행하고, 메모리 사용량이 늘어나기 시작하면 1회 실행하고, 최종적으로 도달한 후 다시 실행한다. JHat 또는 타사 도구를 사용하여 덤프 파일을 엽니다.
3.jstack 또는 JCONSOLE
기본적으로 프로세스 호출 스택 정보를 보고 IO 시간 초과, 교착 상태 또는 기타 상황을 분석할 수 있습니다. 프로그램에 이상이 발생할 때 분석해야 하는 정보는 문제를 찾아 해결하는 데 도움이 될 수 있습니다.
jstat -gc pid gaptime GC 관련 정보 보기
jstat -compiler pid 실시간 컴파일 정보 보기
4.kill -3
위와 동일, 개발 도구가 없는 서버에 적합 콜 스택 정보 및 일부 GC 정보를 출력할 수 있습니다.
5.iftop 네트워크 포트 보기
네트워크 인바운드 및 아웃바운드 트래픽과 대상 서버 간의 트래픽을 확인하여 공격에 의한 것인지 문제를 해결하는 데 도움이 됩니다.
pstack 가상 머신 스택
은 일반적으로 사용되는 gdb를 설치해야 합니다. 특정 가상 머신 수준 오류가 발생할 때 c/C++ 프로그램을 확인하는 데 사용됩니다.
요약
위 내용은 Java의 프로그램 실행 메커니즘 및 오류 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!