
1. 힙 객체 헤더의 비효율과 이를 줄이기 위한 새로운 자바 객체 헤더(New Java Object Header: Compact Object Headers)[ 힙 객체 헤더의 비효율성 ]앞서 설명하였듯 자바에서 객체의 크기를 구하려면 기본적으로 객체의 헤더 크기에 변수의 크기(원시 타입인 경우) 또는 참조의 크기(참조 타입인 경우)를 더해주어야 한다. 그리고 만약 더해진 값이 8의 배수가 아니라면, 별도의 패딩 바이트를 더하여 객체의 크기가 항상 8의 배수가 되도록 보정하고 있다. Klass 포인터 압축 유무 혹은 최대 힙의 크기 등에 따라 실제 사용되는 바이트의 수가 달라질 수 있는데, 64비트 JVM을 기준으로 이를 정리하면 다음과 같다.상태마크 워드의 크기클래스 워드의 크기클래스 포인터 비압축(no..

1. JVM 내부의 힙 객체의 헤더 (Heap Object Header on JVM Internals) [ 객체의 메모리 레이아웃과 객체 헤더 ]객체의 메모리 레이아웃다음의 HotSpot JVM 객체 메모리 구조에서 보이듯이, 모든 자바 객체는 인스턴스 데이터(payload) 외에도 객체의 헤더나 정렬 패딩을 위한 메모리 공간이 존재함을 알 수 있다. 위와 같은 여러 정보들이 모여서 하나의 객체가 되는데, 그 중에서도 우리가 눈여겨볼 부분은 객체의 헤더 부분이다. 배열의 길이는 우리가 이미 알고 있기에, 그 중에서 마크 워드와 클래스 워드에 집중해서 살펴보도록 하자. 마크 워드(mark word)마크 워드(mark word)는 포인터가 아니라 그 자체로 데이터를 담고 있는 비트 필드(bit fiel..
1. Record 클래스의 개념과 도입 배경[ 개발 트렌드의 변화 ]21세기는 두말 할 필요 없이 데이터가 중심인 세상이다. 많은 데이터들이 기록되고 수치화되며, 데이터를 분석하여 얻은 결과는 수 많은 의사결정의 근거가 된다. 또한 MSA의 시대가 도래함에 따라 데이터의 교환이 점점 더 중요해지고 있다. 자바는 객체 지향 프로그래밍(OOP, Object-Oriented Programming) 언어로서, 객체를 중심으로 설계되고 개발되어 왔다. 그러나 최근 몇 년간 프로그래밍 패러다임이 변화하면서 OOP의 한계가 드러나고 있다. 특히 과거에는 장점이라고 평가받았던 객체지향 프로그래밍의 복잡한 엔티티(Entity)나 바운더리(Boundary) 등이 점점 덜 중요해지고, 순수한 데이터의 교환이 더욱 중요해지는..

1. 네이티브 메서드와 블로킹 I/O로 대기중인 자바 스레드의 상태(Java Thread State on Blocking I/O with Native Method)[ 문제에 대한 이해 ]오늘날 대부분의 서비스들은 서버-클라이언트 모델을 기반으로 하고 있고, 스프링과 같은 애플리케이션의 내부 역시 다음과 같은 서버 소켓을 통한 연결, 그리고 통신이 기반을 이루게 된다.그렇다면 다음과 같이 원시적인 형태의 ServerSocket 생성하고, 요청에 대한 수립을 기다리는 accept()를 호출중인 코드가 존재한다고 하자.fun main(args: Array) { val serverSocket = ServerSocket(13232) val socket = serverSocket.accept() s..

1. 프로젝트 발할라(Project Valhalla)를 통해 알아보는 자바 언어의 진화 [ 프로젝트 발할라(Project Valhalla) 란? ]프로젝트 발할라는 객체 지향 프로그래밍의 추상화와 원시 타입의 뛰어난 성능 특성을 결합한 값 객체(value objects)의 도입과 제네릭(generic)에 대한 원시 타입의 지원을 강화하는 등의 작업을 통해 많은 개선을 이뤄내고자 하고 있다. 대표적으로 다음과 같은 기능들이 여러 배포에 걸쳐 추가될 것이다.Value Classes and Objects: 객체에 identity를 부여하지 않음으로써 최적화된 인코딩을 가능하게 하는 값 클래스와 객체를 도입함Null-Restricted and Nullable Types: 널-인지 타입에 대한 언어적 지원과 널-..