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. 협력의 진화 내용 정리[ 1. 협력, 무엇이 문제인가 ]이 책에서 제시하는 협력이론은, 사회 구성원들에게 강제적으로 협력을 강요하는 중앙 권위체가 없는 상태에서 이익을 추구하는, 이기적 개인들에 대한 연구와 조사를 바탕으로 한다.이런 온갖 유형의 특정 사례들을 분석해 들어가려면, 우선 각 경우에 특수한 세부사항들에 얽매이지 말고 이들 상황을 공통적으로 묘사할 수 있는 방법이 필요하다. 다행히도 그런 방법이 있다. 바로 그 유명한 ‘죄수의 딜레마’ 게임이다.개인적으로 합리적인 결론이, 두 사람 모두에게는 더 나쁜 결과를 가져오는 것이다. 이것이 딜레마다.여러 번 게임을 하더라도 게임의 횟수가 미리 정해져 있고 이 사실을 참가자들이 알고 있다면, 경기자들은 역시 협력할 동기가 없어진다. 이런 상황은 특..
1. 스프링 부트의 JAR 파일 처리 방식[ WAR 방식의 한계점과 스프링 부트의 등장 ]이전 포스팅에서 살펴보았듯, 스프링 부트는 컨테이너리스(Containerless) 웹 애플리케이션 아키텍처에 대한 요구와 함께 등장했다. 과거에는 톰캣 같은 웹 애플리케이션 서버(WAS)를 먼저 설치하고, 애플리케이션 코드를 WAR로 빌드한 후, 빌드한 WAR 파일을 WAS로 옮기고(배포) WAS를 실행하는 절차들이 필요했다.하지만 이는 WAS를 서버에 직접 설치해야 하는 번거로움 뿐만 아니라, 개발 환경 설정과 배포 과정의 복잡함 등 많은 단점이 있었다. 따라서 스프링이 “애플리케이션의 설정을 처음부터 끝까지 지원하는 아키텍처를 제공해준다면, 단순히 main 메소드를 호출하는 것 만으로도 애플리케이션의 실행과 ..
1. 제품은 가설의 조합이다. [ 될 놈 그리고 안될 놈]기업으로서의 구글은 실패가 혁신의 불가피한 부산물임을 알고 있기에 관대하게 실패를 그대로 인정해준다. 하지만 구글의 직원 개개인은 분명 실패를 두려워 하고 있었고, 대부분은 이미 성공했거나 잘 알려진 제품 관련 부서에서 일하는 쪽을 선호했다. ‘성공’ 하면 떠오르는 사람이 되고 싶고, 실패는 피하고 싶기 때문이다.하지만 모두가 성공한 제품에서 일할 수는 없으며, 우리는 계속해서 시장에 새로운 제품을 출시해야 한다. 현실은 다음과 같기에 실패를 존중하는 편이 이롭다.대부분의 신제품은 시장에서 실패한다. 유능하게 실행해도 마찬가지다. 대부분의 제품이 실패하는 이유는 처음부터 제품 아이디어가 잘못되었기 때문이다. 우리는 제품을 제대로 만들지만, ‘될 ..