자바는 시작하기는 쉽지만 마스터하기는 어려운 언어라는 것을 조금이라도 아는 사람은 알아야 한다. 지식이 많기 때문에 하루아침에 마스터할 수는 없다는 것이다. Java 프로그램의 작동 메커니즘과 작동 과정에 대해 설명합니다. 일부 기사는 제가 수집한 것이므로 좀 더 수준 높은 기사를 계속해서 업데이트하겠습니다. 나는 항상 다른 사람들을 돕는 목적을 옹호할 것입니다. apache php mysql
java에는 Java 가상 머신과 가비지 수집 메커니즘이라는 두 가지 핵심 메커니즘이 있습니다. 현재 여기서 주요 초점은 Java 프로그램을 실행하는 jvm에 있습니다.
(1) 자바 프로그램을 터미널에서 실행하는 방법 (맥에서 실행했는데 원리는 윈도우에서도 같고 거의 같습니다) # 🎜🎜## 🎜🎜# 이 작업을 수행하기 전에 jdk가 설치되어 있어야 하며 문제가 없습니다.
먼저 자바 클래스를 실행하려면 먼저 자바 클래스가 있어야 합니다
1.java라는 폴더를 생성하고, 그 아래에 폴더를 생성합니다. .java 파일로 끝나는 폴더(나는 sublime으로 편집했고 다른 편집자들도 괜찮음), 여기에 HelloWorld가 있습니다.
2. 명령을 통해 파일을 저장합니다#🎜 🎜#
192:libexec huayu$ javac /Users/huayu/Desktop/java/HelloWord.java
192:java huayu$ java HelloWord HelloWord
사실 위 예문의 글자가 틀린 건 알고 있어요. 못 본 척 하고 놔주세요 히히
# 🎜🎜# (2) jvm의 작동 원리
위 예제의 목적은 터미널에서 Java 프로그램을 실행하는 방법을 알려주는 것이 아니라 모든 사람에게 무엇을 알려 주는 것입니다. 위 과정에서 어떤 작업을 수행했는지. javac 프로그램은 Java 컴파일러입니다. HelloWorld.java 파일을 HelloWorld.class 파일로 컴파일하여 Java 가상 머신으로 보냅니다. 가상 머신은 컴파일러가 클래스 파일에 배치한 바이트코드를 실행합니다.(1) JVM 클래스 파일 로딩의 원리 메커니즘
JVM에서 클래스 로딩은 ClassLoader에 의해 수행됩니다. ) 및 해당 하위 클래스입니다. Java의 클래스 로더는 런타임 시 클래스 파일에서 클래스를 찾고 로드하는 역할을 하는 중요한 Java 런타임 시스템 구성 요소입니다.
Java의 크로스 플랫폼 특성으로 인해 컴파일된 Java 소스 프로그램은 실행 가능한 프로그램이 아니라 하나 이상의 클래스 파일입니다. Java 프로그램이 특정 클래스를 사용해야 하는 경우 JVM은 클래스가 로드, 연결(검증, 준비 및 구문 분석)되고 초기화되었는지 확인합니다. 클래스 로딩은 클래스의 .class 파일에 있는 데이터를 메모리로 읽는 것을 의미하며, 일반적으로 .class 파일로 읽어들이기 위해 바이트 배열을 생성한 다음 그에 해당하는 클래스를 생성합니다. 로드된 클래스. 로딩이 완료된 후에도 Class 객체가 완성되지 않아 아직 클래스를 사용할 수 없습니다. 클래스가 로드되면 확인, 준비(정적 변수에 대한 메모리 할당 및 기본 초기 값 설정) 및 구문 분석(기호 참조를 직접 참조로 대체)의 세 단계를 포함하는 연결 단계에 들어갑니다. 마지막으로 JVM은 다음을 포함하여 클래스를 초기화합니다. 1) 클래스에 직접적인 상위 클래스가 있고 클래스가 초기화되지 않은 경우 상위 클래스를 먼저 초기화합니다. 2) 클래스에 초기화 문이 있는 경우 다음 초기화 문을 실행합니다. 순서대로.클래스 로딩은 루트 로더(BootStrap), 확장 로더(Extension), 시스템 로더(System) 및 사용자 정의 클래스 로딩 로더(java.lang의 하위 클래스)를 포함하는 클래스 로더에 의해 완료됩니다. .ClassLoader). Java 2(JDK 1.2)부터 클래스 로딩 프로세스는 PDM(Father Delegation Mechanism)을 채택합니다. PDM은 Java 플랫폼의 보안을 더 잘 보장합니다. 이 메커니즘에서는 JVM과 함께 제공되는 부트스트랩이 루트 로더이고 다른 로더에는 상위 클래스 로더가 하나만 있습니다. 클래스를 로드하려면 먼저 상위 클래스 로더가 로드되어야 하며, 상위 클래스 로더가 아무것도 할 수 없는 경우에만 해당 하위 클래스 로더가 자체적으로 로드됩니다. JVM은 Java 프로그램에 대한 부트스트랩에 대한 참조를 제공하지 않습니다.
다음은 여러 클래스 로더에 대한 지침입니다.
가상 머신은 바이트코드를 머신 명령어로 사용하는 CPU로 이해될 수 있습니다.
운영 플랫폼마다 다른 가상 머신이 있습니다.
Java 가상 머신 메커니즘은 기본 운영 플랫폼의 차이점을 보호하고 "한 번 컴파일하면 어디서나 실행"을 달성합니다.
(3) 가비지 수집 메커니즘(GC)
GC란 무엇인가요?
GC는 메모리 처리 과정에서 프로그래머가 잊어버리거나 잘못된 메모리 재활용 문제를 일으키게 됩니다. Java에서 제공하는 GC 기능은 자동으로 메모리를 회수하는 목적을 달성하기 위해 객체가 범위를 초과하는지 여부를 자동으로 감지할 수 있습니다. Java 언어는 할당된 메모리를 해제하는 명시적인 작업 방법을 제공하지 않습니다. Java 프로그래머는 메모리 관리에 대해 걱정할 필요가 없습니다. 가비지 수집기가 메모리 관리를 자동으로 처리하기 때문입니다. 가비지 수집을 요청하려면 System.gc() 또는 Runtime.getRuntime().gc() 메서드 중 하나를 호출할 수 있지만 JVM은 명시적인 가비지 수집 호출을 마스킹할 수 있습니다. 가비지 수집은 메모리 누수를 효과적으로 방지하고 사용 가능한 메모리를 효과적으로 사용할 수 있습니다. 가비지 수집기는 일반적으로 예측할 수 없는 상황에서 오랫동안 사용되지 않은 메모리 힙의 개체를 지우고 재활용하기 위해 별도의 우선 순위가 낮은 스레드로 실행됩니다. 또는 모든 개체가 가비지 수집을 거칩니다(프로그래머는 수집 시간을 정확하게 제어할 수 없습니다. System.gc() 또는 Runtime.getRuntime().gc()를 호출하는 것은 GC에 이를 수집하도록 알리는 것과 같습니다. 잠시일 뿐 확실하지 않습니다. 언제 모을지.)
Java 초기에는 가비지 수집이 Java의 가장 큰 특징 중 하나였습니다. 서버 측 프로그래밍이 메모리 누수를 효과적으로 방지해야 했기 때문입니다. 그러나 시간이 지나면서 Java의 가비지 수집 메커니즘은 비판을 받게 되었습니다. . 모바일 스마트 단말기 사용자는 일반적으로 iOS 시스템이 Android 시스템보다 더 나은 사용자 경험을 갖고 있다고 생각합니다. 뿌리 깊은 이유 중 하나는 Android 시스템의 가비지 수집을 예측할 수 없다는 것입니다.
보충: 세대별 복사 가비지 수집, 표시된 가비지 수집, 증분 가비지 수집 등을 포함한 다양한 가비지 수집 메커니즘이 있습니다. 표준 Java 프로세스에는 스택과 힙이 모두 있습니다. 스택은 기본 지역 변수를 저장하고, 힙은 생성할 객체를 저장합니다. 힙 메모리 회수 및 재사용을 위한 Java 플랫폼의 기본 알고리즘을 Mark and Sweep이라고 하지만 Java에서는 "세대 가비지 수집"을 사용하여 이를 개선했습니다. 이 방법은 Java 개체의 수명 주기에 따라 힙 메모리를 여러 영역으로 나눕니다. 가비지 수집 프로세스 중에 개체가 여러 영역으로 이동할 수 있습니다.
- Eden: 개체가 처음 태어난 영역입니다. 그리고 대부분의 물체의 경우, 이곳은 그들이 존재했던 유일한 영역입니다.
- 생존자: 에덴동산에서 살아남은 개체가 여기로 이동됩니다.- 테뉴어드(Tenured): 이곳은 충분히 오래되고 살아남은 물건들의 집입니다. Young Generation Collection(Minor-GC) 프로세스는 이 부분을 건드리지 않습니다. 젊은 세대 컬렉션이 평생 돌봄 정원에 개체를 넣을 수 없는 경우 전체 컬렉션(Major-GC)이 시작되며, 큰 개체를 위한 충분한 공간을 만들기 위해 압축이 필요할 수도 있습니다.
가비지 수집과 관련된 JVM 매개변수:
-Xms / -Xmx — 힙의 초기 크기 / 힙의 최대 크기
주제 해제 , jvm의 실행 메커니즘에 대해 이야기하고 나면 java 컴파일된 언어인가요, 아니면 해석된 언어인가요?
먼저 이 두 가지 언어 유형에 대한 소개를 살펴보겠습니다.
고급 컴퓨터 언어 유형에는 주로 컴파일된 유형과 해석된 유형이 포함됩니다.
컴파일된 언어: 프로그램이 실행되기 전에 별도의 컴파일 프로세스가 있습니다. . 나중에 프로그램을 실행할 때 다시 번역할 필요가 없도록 프로그램을 기계어로 번역합니다.
해석 언어: 프로그램 실행 시 프로그램을 기계어로 번역하므로 컴파일 언어에 비해 실행 속도가 느립니다.
둘 사이의 가장 큰 차이점은 대상 기계어가 저장되는지 여부입니다. 컴파일은 입력된 소스 프로그램을 특정 단위(예: 기본 블록/함수/메소드/트레이스 등)의 대상 기계어 코드로 변환하여 저장합니다. (디스크에 있든 메모리에 있든 상관없이) 후속 실행에 재사용할 수 있습니다. 해석은 소스 프로그램의 명령어를 하나씩 해석하고 실행하며, 해석하면서 실행하는 것입니다. 대상 코드는 저장되지 않으며 거기에 후속 실행에서 재사용할 수 있는 정보가 아닙니다.
Java 실행 프로세스 이해: Java 소스 파일(*.java)은 Java 컴파일러(javac)에 의해 컴파일되어 ByteCode 바이트코드 파일(*.class)을 생성합니다. 바이트코드는 Java 자체가 설계한 컴퓨터에 의해 설계됩니다. JVM(Java Virtual Machine)이 해석하고 실행합니다. 가상 머신은 실행될 각 바이트코드를 인터프리터에게 보내고, 인터프리터는 이를 특정 머신의 대상 머신 코드로 변환한 후 특정 머신에서 실행합니다.
Java의 첫 번째 프로세스는 javac 컴파일이고, 대상 파일은 기계어가 아닌 ByteCode이지만, 미래에는 세 가지 처리 방법이 있을 수 있습니다(여기서는 현재 이 세 가지 처리 방법에 대한 평가가 없습니다. JVM 지식에 대한 심도 있는 토론 후 검증이 필요합니다.
1. 런타임 중에 JVM이 ByteCode를 하나씩 인터프리터에 전송하고, 인터프리터는 이를 기계어 코드로 변환하여 실행합니다. (많은 사람들이 해석된 언어에 대해 이야기하는데 이것이 출발점입니다.)
2. 런타임 중에 일부 ByteCode는 JIT(Just-In-Time 컴파일러)에 의해 대상 기계 코드로 컴파일된 다음 실행될 수 있습니다(메소드를 다음과 같이 사용). 변환) 단위에 저장되며 두 번째 실행을 위해 기계어 코드로 변환할 필요가 없습니다. 일부 JVM은 순수 JIT 컴파일을 사용하여 구현되고 내부에 JRockit 및 Maxine과 같은 인터프리터가 없기 때문입니다. VM.
3. RTSJ는 javac 이후에 AOT 보조 컴파일을 수행하여 정적 대상 플랫폼 코드를 생성합니다.
때로는 위의 세 가지 방법을 동시에 사용할 수 있습니다. 적어도 1과 2는 동시에 사용되며 3은 프로그래머가 수동으로 지정해야 합니다.
이 점에서 저는 Java가 컴파일과 해석의 혼합 언어라는 점을 더 기꺼이 받아들입니다.
end:
이 글은 여기까지입니다. 부족한 점이 있으면 지적해주시고 소통해주세요!
관련기사:
관련 영상:
메소드 호출 void형 메서드 정의 및 호출- JAVA 기본 소개 비디오 튜토리얼
위 내용은 터미널에서 Java 프로그램을 실행하는 방법은 무엇입니까? 작동 메커니즘 및 작동 원리를 분석합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!