이 글은 자바 프로그래밍 면접 이렇게 준비한다(노엘 마크엄) 및 여러 블로그들을 참고하며 간단한 부분들만 정리한 글이다.
자바 가상머신(JVM)은 프로그램이 실행되는 플랫폼이다. 플랫폼은 여러가지 기능을 제공해주는 실행환경이다. 자바 컴파일러는 .java파일을 .class 라는 Java Byte Code로 컴파일한다. 이 바이트코드는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. 이때 JVM은 OS에 맞게 해석해 주는 역할을 한다.
여기서 다른 컴파일 언어와의 차이점은 JVM은 운영체제와 애플리케이션 사이에 위치하면서 애플리케이션이 플랫폼에 상관없이 독립적으로 실행될 수 있도록 만들어 준다. 즉, OS에 상관없이 실행한다는 것이다.
JVM은 모든 중요한 애플리케이션 개발에서는 애플리케이션이 JVM과 어떻게 상호작용을 하는지, 다양한 조건에서 어떻게 작동하는지 테스트하고 확인해야 한다. 그만큼 여러군데서 JVM과 상호작용을 할 수 있다는 것이다.
예를들면 메모리는 스택과 힙 두 영역으로 구분된다. 스택은 기본값, 객체의 참조, 메서드가 저장되는 위치이다. 그렇기에 스택의 생애주기는 for, while 등 코드의 scope에 영향을 받는다. 메서드를 호출했을 때 선언된 변수들은 스택의 상단에 위치한다. 만약 재귀함수를 실행할 때 잘못해서 너무많이 호출한다면 스택 메모리 영역이 가득 차게되서 out-of-memory(메모리 부족)이 발생할 수 있다. 이를 StackOverFlowError이라고 한다.
for문같은 반복문은 내부에 변수를 선언해도 그 선언된 변수만큼의 공간만 있으면 된다. 그렇기에 for문을 무한번 실행해도 그 내부에 있는 것들만 스택에 쌓일 것이다.
JVM은 각각의 메모리 영역에 할당된 메모리의 크기를 지정할 수 있는 커맨드라인 매개변수를 제공한다.
▼ 가비지 컬렉션(GC)
가비지 컬렉션은 기본에 할당된 메모리를 재사용하는 메커니즘으로, 나중에 메모리를 할당할 때 재사용할 수 있다.
C나 C++에서 malloc로 메모리를 할당하면 항상 free로 해제를 해줘야했었다. 하지만 자바나 C#같은 언어에서는 효율을 높이기 위해 메모리를 자동으로 관리하는 시스템이 있다. 자바에서는 이 시스템이 가비지 시스템이다. 사용되지 않는 할당된 메모리 블록을 찾아서 이를 다시 사용할 수 있도록 하는 것이다.
가비지 컬렉션에 자세한 동작방식을 확인하고자 한다면 https://velog.io/@litien/%EA%B0%80%EB%B9%84%EC%A7%80%EC%BB%AC%EB%A0%89%ED%84%B0GC 를 참고하길 바란다.
참고
자바 프로그래밍 면접 이렇게 준비했다 - 노엘 마크엄
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://velog.io/@litien/%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0GC
https://d2.naver.com/helloworld/37111
'JAVA' 카테고리의 다른 글
자바 StringBuilder를 통해 빠르게 출력하기 (0) | 2021.12.08 |
---|---|
자바 입력, 출력 시 BufferedReader, BufferedWriter를 사용해보자! (0) | 2021.11.22 |
자바 핵심 기본 내용 (0) | 2021.10.17 |
java - Priority Queue(우선순위 큐) (0) | 2021.10.05 |
JAVA - Class 객체의 ArrayList 다중 정렬 (0) | 2021.09.13 |