자바가 탄생하기 이전에는 C++이 많이 사용되고 있었다. C++는 C 언어를 기반으로 한 객체 지향 언어로, 운영체제에 독립적이지 못한 단점을 갖고 있었다. 즉, 운영체제 별로 프로그램을 만들고 컴파일 해줘야 했다.
이런 문제점을 해결하고자 만든 것이 Java이다.
Java는 객체 지향 언어이면서, 운영체제에 독립적이다.
이런 독립성은 JVM을 통해서 만들어진다.
Java는 "Write Once, Run Anywhere"라는 슬로건을 내세운 "객체 지향 프로그래밍 언어"이다.
1. 운영체제에 독립적
자바 이전의 언어들은 특정 CPU에서만 작동하거나 특정 OS에 따라 다르게 작성해야 하는(C, C++) 언어들이 대부분이었다.
자바는 JVM
이 설치되어 있는 모든 운영체제에서 실행이 가능하다.
2. 객체 지향 언어(OOP)
Java는 객체 지향 언어(Object Oriented Programming)
이다.
모든 기능은 객체로 만들어 사용되며, 객체 지향적으로 설계된 프로그램은 유지보수가 쉽고 확장성이 높다.
3. 함수형 프로그래밍 지원
Java 8 버전 부터 람다식과 스트림이 추가되어 코드가 간결해졌다.
4. 자동 메모리 관리(Garbage Collection)
Java는 가비지 컬렉터가 있어, 사용하지 않는 메모리를 자동으로 수거해준다.
메모리를 관리하는 수고를 덜 수 있다.
Class Loader(클래스 로더)
Execution Engine(실행 엔진)
: 클래스를 실행시킨다. 바이트코드를 기계어로 변환하는데 이때 변환하는 방법은 2가지가 있다.Garbage collector
: 힙 영역에 사용되지 않는 객체들을 제거하는 작업Runtime Data Area
: 프로그램을 실행하기 위해서 OS에게 할당받은 메모리1) 소스 코드(.java)를 컴파일러(javac)가 컴파일한다.
2) JVM은 컴파일된 바이트코드(.class)를 각 운영체제에 맞는 기계어로 변한다.
프로그램이 실행되기 위해서는 운영체제에게 자원(cpu, 메모리, I/O 등)을 할당받아야 한다. 따라서 프로그램이 필요한 자원을 운영체제에게 요청하고, 운영체제가 이 요청을 받아들여 프로그램에게 자원을 할당해준다.
이때 프로그램이 자원을 요청하는 방식이 운영체제마다 다르고, 이것 때문에 운영체제에 종속성을 가지게 되는 것이다.(운영체제에 맞게 프로그래밍 해줘야 한다.)
하지만 자바는 JVM이 있기 때문에 운영체제에 독립적일 수 있다. JVM은 자바 코드로 작성된 프로그램을 운영체제에 맞게 실행시키기 때문이다.
자바는 JVM을 통해서 운영체제와 소통한다.
즉, JVM은 자바 프로그램(애플리케이션)과 운영체제의 통역가 역할을 하는 것이다.
JVM은 여러 버전이 있고(Window 버전 JVM, Mac 버전 JVM 등), 각각의 버전들이 본인의 운영체제에 맞게 프로그램을 변환해준다.
즉, JVM으로 인해서 운영체제로부터 독립적일 수 있다.
[참고]
https://m.blog.naver.com/goreng2/221770110714
http://asfirstalways.tistory.com/158
컴파일: 개발자가 만든 소스 코드를 컴퓨터가 이해할 수 있도록 0과 1로 구성된 바이너리 언어로 파일로 바꾸어 주는 것
평소엔 인터프리터(6-1)
로 실행하다가, 특정 코드가 자주 반복되면 해당 코드를 JIT Compiler(6-2)
를 통해 실행시킨다. JIT 컴파일러로 인해서 효율성이 향상된다.
이전에 작성해둔 [Java] 객체지향 프로그래밍 기초 글 참고!
힙 영역에 저장되는 객체들은 대부분 일회성이고, 저장되어 있는 시간은 짧다.
그래서 얼마나 살아있느냐에 따라 Young, Old 영역으로 나눈다.
[이미지 출처]
http://asfirstalways.tistory.com/158
즉, 모든 스레드를 중단시키고, 사용되는 메모리와 사용되지 않는 메모리를 식별하여 사용되지 않는 메모리는 해제해준다.