JAVA/JAVA (JVM)
자바는 Call by reference ? Call by value ?
자바의 Call by Value / Call by Reference 프로그래밍을 하다보면 반드시 마주치는 것이 바로 call by value / call by reference 개념이다. 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라 반환 결과가 달라지기 때문에 대부분의 프로그래밍 교육과정에선 중요시 하게 여긴다. (필자도 학부 시절에 C언어 쪽에서 접했던 기억이 있다.) 자바에서도 역시 call by value 와 call by reference 동작 차이가 존재한다. 자바의 데이터형을 알아보면 크게 두가지로 나뉘게 된다. 기본형(primitive type) - Boolean Type(boolean), Numeric Type(short, int, long, float, double, c..
자바 코드의 메모리 영역(스택 & 힙)
자바의 메모리 영역 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리 한다. JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static) 영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 된다. 컴퓨터의 메모리는 사용할 수 있는 공간이 한정되어 있기 때문에 어떻게 관리하느냐에 따라서 프로그램의 성능(속도 등)이 좌우된다. 그래서 메모리 설계가 잘되어 있는 프로그램에 비해 그렇지 않은 프로그램은 속도 저하 현상이나 튕김 등의 현상이 일어날 확률이 크다. 결과적으로 같은 기능의 프로그램이라 하여도 메모리의 관리에 따라 성능 차이가 나게 되는 ..
[JVM] 자바와 T 메모리 구조 2편
[JVM] 자바와 T 메모리 구조 1편에서는 main(), 변수, block, static 변수, 멀티 프로세스, 멀티 쓰레드, 스프링에서의 T 메모리에 대해 살펴보았다. 본 포스팅에서는 추상화, 상속, 다형성 코드에 대해서 T 메모리에 어떻게 저장되는지 살펴보자. 추상화와 T 메모리 [Mouse.java] public class Mouse { public String name; public void sing() { } } [MouseDriver.java] public class MouseDriver { public static void main(String [] args){ Mouse mickey = new Mouse(); mickey.name = "미키"; mickey = null; } } Mouse..
[JVM] 자바와 T 메모리 구조 1편
자바의 T메모리 구조 자바의 RunTime Data Area영역은 스태틱, 스택, 힙 3가지 영역으로 분리하여 간략하게 T 메모리 구조라고 지칭한다. 사실은 조금 더 복잡하지만 변수의 저장 방식에 대해서 설명하기 위해 간략하게 표현한 것이다. 스태틱(Static) 영역 (클래스의 놀이터) Method Area, Class Area, Code Area라고도 불리며 JVM이 동작해서 클래스가 로딩될 때 생성된다. 스태틱 영역에는 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등 클래스와 인터페이스의 구조가 저장되는 공간이다. 해당 메소드와 변수를 선언된 범위 내에서는..
실수 표현(부동 소수점) 방식
실수의 2진수 표현 10진수의 정수를 2진수의 정수로 변환할 수 있듯이, 10진수의 소수를 2진수의 소수로 변환할 수 있다. 예를들어 10진수 11.765625 를 2진수 소수로 변환하는 방법은 다음과 같다. 먼저 숫자를 정수부 11 와 소수부 0.765625 로 나누어주고, 각각 2진수로 변환해주면 된다. 정수부 2진수 변환 정수부에 2를 지속적으로 나눈다. 몫은 계속 2로 나누어주고, 나머지값은 따로 모아준다. 더이상 나눌수 없을때 나머지 값을 모아 연결해주면 1011(2)로 간단히 변환이 된다. 실수부 2진수 변환 절대값이 1보다 작은 10진수 소수에 2를 곱한다. 2를 곱한 결과는 1을 넘거나 넘지 않을 것이다. 만약 1을 넘었을 경우 결과에서 1을 떼어내고, 아니면 0으로 처리하며 다음 계산을 ..
[JVM] 성능 테스트를 위한 JVM Warm-up 하기
Java 컴파일 1. 컴파일 과정 JVM 실행 전 1) 소스 코드(.java)를 바이트 코드(.class)로 변환 (Java compiler) JVM 실행 후 2) 해당 클래스를 사용하는 시점에 클래스 로더가 lazy loading 3) 로딩 된 클래스를 OS가 이해할 수 있는 기계어로 변환 (인터프리터) 여기서 알 수 있는 사실은 Java는 C 언어 처럼 미리 기계어로 변환해두지 않고, 자바 컴파일러로는 바이트 코드로 변환 후 실제 클래스가 사용되는 시점에 인터프리터가 기계어로 변환한다는 것이다. 클래스 로더에 대한 자세한 설명은 다음 포스팅을 참고 [JVM] JVM 클래스 로더 (Class Loader) Class Loader 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모..
[JVM] JVM 클래스 로더 (Class Loader)
Class Loader 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 JVM의 클래스 로더(class loader)라고 한다. 자바에서 소스를 작성하면 .java파일이 생성되고 .java소스를 컴파일러가 컴파일하면 .class파일이 생성되는데 클래스 로더는 .class 파일을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재한다. (같은 JVM 내에서 동작) 클래스 로더는 계층 구조를 가지고 있으며 System Class Loader는 Platform Class Loader를 부모로 가지고, Platform Class Loader는 Boo..
내부 클래스는 꼭!! static 으로 선언해야한다.
Inner 클래스의 문제점 인텔리제이와 같은 IDE에서 내부 클래스를 선언하여 사용하면 다음과 같이 경고 메세지가 뜰 것이다. (내부 클래스가 외부의 멤버를 참조하여 사용하지 않을 경우) 메세지 내용을 보면 Inner class ' ' may be 'static'. 즉, 내부 클래스를 인스턴스가 아닌 static으로 설정하라는 경고이다. 별거 아닌 경고인줄 알고 무시하기에는, inner 클래스가 가지는 심각한 문제를 보면 마음이 바뀔 것이다. 왜냐하면 inner 클래스는 inner static 클래스보다 메모리를 더 먹고, 더 느리고, 바깥 클래스가 GC 대상에서 빠져 버려 메모리 관리가 안될 수 있기 때문이다. Inner 클래스는 외부 참조를 한다 일반적으로 내부 인스턴스 클래스를 만들기 위해서는 먼저..
클래스는 언제 메모리에 로딩 & 초기화 되는가
JVM의 클래스 로더 (Class Loader) 자바의 클래스들이 언제 어디서 메모리에 올라가고 클래스 멤버들이 초기화되는지, 원리를 알기위해선 우선 JVM(자바 가상 머신)의 클래스 로더(Class Loader)의 진행 방식에 대해 알 필요가 있다. 특히나 다음과 같이 내부(중첩) 클래스 중에 static 키워드가 붙고 안붙고의 유무에 따른 메모리 로드 차이와 쓰레드에 세이프하다는 등, 이러한 부분은 꽤나 고수준의 지식이기 때문에 글 로만 훑어보고 넘어가기 다반사라 이를 이해하기 위해선 클래스 로더 부터 살펴볼 필요가 있다. class Outer { class Inner { } static class Holder { } } 클래스 로더는 컴파일 된 자바의 클래스 파일(*.class)을 동적으로 로드하고..
[JAVA] 가비지 컬렉션(Garbage Collection) 동작 원리 & GC 종류
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 객체(garbage)를 주기적으로 제거하는 프로세스를 말한다. C나 C++에서는 free()라는 함수를 통해 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 한다. 반면 Java는 JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 완벽하게 관리하지 않아도 되어 오롯이 개발에만..