
1. HashMap의 내부 동작 깊게 들여다보기(HashMap Internals with Separate Chaining & Treeify, Capacity & LoadFactor 등)[ HashMap의 해시 버킷 Separate Chaining과 Treeify ]HahsMap은 내부적으로 노드 배열로 저장되는데, 이때 각 노드 배열의 요소를 해시 버킷이라고 한다. HashMap을 생성할 때 별도의 해시 버킷 배열의 capacity를 지정하지 않는다면 기본값 16으로 할당된다. 이러한 부분을 그림으로 표현하면 다음과 같다. HashMap은 데이터를 저장할 키에 대한 해시코드(hashcode)를 계산하고 해당 값을 배열의 크기로 나누어, 데이터를 저장할 해시 버킷의 인덱스를 구하고, 해당 해시 버킷에 ..

1. 스템의 성능과 volatile 키워드를 통한 메모리 가시성에 대한 이해(Memory Visiblilty)[ 시스템의 성능에 대한 이해, 성능은 어디에서 오는가? ]무어의 법칙(Moore's law)과 컴퓨터 구조(Computer Architecture)무어의 법칙(Moore's law)은 인텔의 창업자 중 한명인 고든 무어(Gorden Moore)가 명명한 것으로, 경제적으로 생산 가능한 칩 위의 트랜지스터 수는 대략 2년마다 거의 2배로 증가함을 뜻한다.무어의 법칙이 성능이 아닌 트랜지스터 수를 기준으로 한다는 것은, 소프트웨어 엔지니어가 하드웨어 엔지니어로부터 얻어낼 수 있는 성능이 2배가 아님을 의미한다.성능에는 여러 가지 복합작인 요소가 작용하는데, 그럼에도 불구하고 성능에 가장 결정적인 요..

1. 올바른 자바/코틀린(Java/Kotlin) 애플리케이션 JVM 메모리 설정 가이드 [ 최소/최대 힙의 크기 ]개발한 애플리케이션을 배포할 때면 여러 가지 설정 및 옵션들을 제공해주어야 하는데, 대표적인 값이 바로 메모리 할당에 대한 부분이다. 자바에서 모든 객체는 힙 영역에 할당되며, 핵심은 힙 메모리의 크기이다. 힙 메모리의 크기를 너무 작게 잡으면 객체를 힙 메모리에 할당할 공간이 부족하여 OutOfMemoryError로 인해 애플리케이션이 비정상적으로 종료되거나 잦은 GC 발생으로 인해 애플리케이션 오버헤드가 증가하여 성능에 문제를 줄 수 있다. 반대로 힙 메모리를 지나치게 크게 잡으면 애프리케이션이 시작할 때 힙 초기화 시간이 길어져 시작 속도가 저하되거나 GC를 수행하는 시간이 길어져 응답..
1. 자바 9에 개선 및 최적화된 String 내부 구조 (JEP254: Compact Strings)[ 자바 8까지의 String 클래스의 문제점 ]자바 8까지는 내부적으로 char형 배열을 사용하여 문자열을 다루고 있었다.public final class String implements java.io.Serializable, Comparable, CharSequence { private final char value[]; private int hash; // ...} 하지만 이러한 방식은 메모리 비효율적인 문제가 있었다. 왜냐하면 자바의 Char 타입과 String 타입은 유니코드를 통해 전 세계적으로 일관되게 텍스트 데이터를 표현하고자 그 당시에 주목받던 UTF-1..
1. 값 객체(Value Object)와 불변성(Immutablity)[ 값 객체(Value Object) 와 참조 객체(reference object) ]프로그래밍을 하다 보면, 사물을 복합적으로 표현하는 것이 유용한 때가 있다. 예를 들어, 좌표는 x 값과 y값으로 표현될 수 있고, 금액은 숫자와 통화로 구성될 수 있다.class Point( val x: Int, val y: Int,) 이때 두 객체가 동일한지를 판단해야 하는 경우가 있는데, 예를 들어 두 Point 객체가 모두 (2, 3)이라는 좌표를 나타낸다면, 이를 동일하게 취급하는 것이 합리적일 수 있다.val p1 = Point(2, 3);val p2 = Point(2, 3);check(p1 == p2) 이렇듯 속성 값에 의해..