SMALL

JVM이란?


기술 면접 및 필기 시험에서 단골로 나오는 JVM에 대해 설명을 하겠습니다.

JVM은 Java Virtual Machine의 줄임말이며 자바 바이트 코드를 OS에 맞게 해석 해준다. 자바 컴파일러는 java 파일을 자바 바이트 코드로 변환시켜 .class 파일을 생성 시킨다. 바이트 코드는 기계어가 아니므로 OS에서 바로 실행 되지 않는다. OS가 바이트코드를 이해시켜주도록 도와주는 것이 JVM이다.

바이트 코드는 JVM위에서 OS 상관없이 실행된다. 이것이 Java의 가장 큰 장점 중 하나이다.


JVM 구조



JVM 구조는 3가지 영역으로 나누어진다.


1) Class Loader

런타임 시점에서 클래스를 로딩하여 클래스의 인스턴스를 생성하여 클래스 로더를 통해 메모리에 로드하게 된다.


2) Runtime Data Areas

JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 밭은 메모리 공간이며, 크게 5가지 영역으로 나눌 수 있다.

  • PC Regisiter

 1. 스레드가 생성 될 때마다 생성되는 공간

 2. 스레드가 어떤 부분을 어떤 명령으로 실행할 지 기록

 3. 현재 실행되는 부분의 명령과 주소를 저장

 4. Native Method를 수행할 때는 PC Register는 Undefined 상태가 된다. 이것은 JVM을 거치지 않고 바로 API를 통해 바로 수행하게 된다는 의미인데, JAVA는 플랫폼에 종속 받지 않는 것을 의미한다.


  • JVM Stack
 1. 매서드가 호출되면 매서드와 매서드 정보를 스택에 쌓게된다.
 2. 매서드의 매개변수, 지역변수, 임시변수, 매서드 호출한 주소를 저장 
 3. 매서드 종료 시 메모리 공간에서 사라짐
  • Native Method Stack
 1. Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack

 2. JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 Stack

 3. JNI를 이용하여 JVM 내부에 영향을 주지 않기 위해서이다.


  • Method Area
 1. 모든 쓰레드가 공유하는 메모리 영역

 2. 클래스, 인터페이스, 매서드, 필드, Static 변수를 저장


  • Heap
 1. 런타임시 동적으로 할당하여 사용 하는 영역
 2. new 연산자로 생성된 객체와 배열을 저장

3) Execution Engine

Load된 클래스의 바이트코드를 실행하는 런타임 모듈이 Execution Engine이다.
클래스 로더를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 Execution Engine에서 실행되며, 자바 바이트 코드를 명령어 단위로 읽고 실행



자주 나오는 질문


1. Stack 영역에서 메모리의 제한된 크기 이상을 사용하게 되면 오버플로우가 발생한다.

2. Heap 영역에서 메모리 할당/해제 동작이 반복되면 메모리 단편화 현상이 일어난다.

3. Heap 영역과 Stack 영역에 대한 메모리 접근속도는 Stack가 훨씬 빠르다. 왜냐하면 Stack는 미리 할당 된 공간을 사용하는 것이고 Heap은 사용시마다 할당 되기 때문이다.


LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
접근제어자  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24
SMALL

 4-way-handshake?


TCP 연결을 위해 3-way-handshake를 했다면 연결을 종료 할 때는 4-way-handshake를 사용한다.



최초의 상태는 서로 통신 중이기 때문에 양쪽이 ESTABLISHED 상태이다.


1. 통신을 종료하려는 Client가 서버에게 FIN 패킷을 보내고 Client는 FIN_WAIT_1 상태로 대기한다.

2. FIN 패킷을 받은 Server는 해당 포트를 CLOSE_WAIT로 바꾸고 잘 받았다고 ACK를 Client에 전하고 ACK를 받은 Client는 FIN_WAIT_2 상태로 변경한다.

그리고 동시에 Server에서는 해당 포트에 연결되어 있는 Application에게 Close()를 요청한다.

3. Close() 요청을 받은 Application은 종료 프로세스를 진행시켜 최종적으로 Close()가 되고 Server는 FIN 패킷을 Clinet에게 전송 후 자신은 LAST_ACK로 상태를 변경한다.

4. FIIN_WAIT_2에서 Server가 연결을 종료했다는 신호를 기다리고 FIN을 받으면 ACK를 Server에 전송하고 TIME_WAIT로 상태를 바꾼다. 그리고 일정시간이 지나면 TIME_WAIT가 CLOSED로 변경 된다. 최종 ACK를 받은 서버는 자신의 포트도 CLOSED로 변경된다.

LIST

'전공 > 네트워크' 카테고리의 다른 글

IEEE 802 위원회 LAN 표준  (0) 2018.07.01
네트워크 토폴로지  (0) 2018.07.01
회선 교환(Circuit Switching)과 패킷 교환(Packet Switching)  (0) 2018.07.01
데이터 전송 방식  (0) 2018.07.01
3-way-handshake  (0) 2018.05.02
SMALL

3-way-handshake?


TCP 통신을 위해 네트워크 연결을 3 way handshake 방식으로 연결한다.



1. Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보낸다.

2. Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경된다.

3. Clinet에서 SYN+ACK를 받고 ESTABLISHED로 상태를 변경, 서버에 요청을 잘 받았다고 ACK를 전송한다. ACK를 받은 서버는 상태가 ESTABLSHED로 변경된다.


3번까지 무사히 완료되면 서로의 포트가 ESTABLISHED 되면서 연결이 된다.


 Closed 

닫힌 상태 

 LISTEN

포트가 열린 상태로 연결 요청 대기 중 

 SYN_RCV

SYN 요청을 받고 상대방의 응답을 기다리는 중 

 ESTABLISHED

포트 연결 상태 


사용 하는 이유


간단히 말하면 상호 신뢰성 때문이다. 신호를 보냈으면 잘 받았냐고 상대 한테 묻고 잘 받았으면 잘 받았다고 응답을 함으로써 데이터 전송을 정확하게 하기 위해서 사용한다.

LIST

'전공 > 네트워크' 카테고리의 다른 글

IEEE 802 위원회 LAN 표준  (0) 2018.07.01
네트워크 토폴로지  (0) 2018.07.01
회선 교환(Circuit Switching)과 패킷 교환(Packet Switching)  (0) 2018.07.01
데이터 전송 방식  (0) 2018.07.01
4-way-handshake  (0) 2018.05.02
SMALL

접근 제어자란?


<종류/범위>

1. private : 같은 클래스 내에서만 접근가능

2. public : 접근 제한이 전혀 없다.

3. protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근가능

4. default : 같은 패키지 내에서만 접근 가능, 접근제어자를 지정하지 않았다면 자동으로 default로 지정


접근 제어자를 사용하는 이유


접근 제어자는 접근 할 수 있는 범위를 제한한다. 외부의 접근으로부터 데이터를 보호하거나, 굳이 보여줄 필요 없는 정보나 내부적으로 사용되는 정보를 숨기기 위해서 이다.

LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24
SMALL

http://blog.daum.net/warmfeel/108 참고


LIST

'전공 > 데이터베이스' 카테고리의 다른 글

UNDO와 REDO  (0) 2018.06.14
UNION과 UNION ALL  (0) 2018.06.11
DB정규화  (0) 2018.05.17
트랜잭션  (0) 2018.05.04
조인  (0) 2018.05.02
SMALL

오버라이딩?


부모 클래스로부터 상속받은 메서드를 재정의 하는 것



위에 보시다 싶이 People 클래스를 Man 클래스가 상속을 받아서 추상 매서드를 재정의 하였습니다. 이게 바로 오버라이딩 입니다.



오버라이딩 조건


1. 매서드 이름이 동일해야 한다.

2. 매개변수가 같아야 한다.

3. 리턴 타입이 같아야 한다.


오버라이딩 주의사항


1. 접근 제어자를 부모 클래스의 매서드보다 좁은 범위로 변경 할 수 없다.

2. 예외는 부모 클래스의 매서드보다 많이 선언할 수 없다.

3. 인스턴스 매서드를 스태틱매서드 또는 그 반대로 변경할 수 없다.


오버로딩?


같은 이름의 매소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르게 하는 것





















LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
JVM  (0) 2018.05.02
접근제어자  (0) 2018.05.02

+ Recent posts