본문 바로가기

분류 전체보기

(8)
[자바] VisualVM 으로 Heap Dump 들여다보기 Heap Dump 를 생성하고 보기 위해 VisualVM 을 사용하는 과정을 정리한 글입니다. Object 의 생성과 Garbage Collection(GC) 으로 인해 heap 에서 Object 가 제거되는 것을 VisualVM 을 통해 눈으로 확인해보겠습니다. VisualVM 은 다양한 기능을 제공하지만 이 글에서는 Heap Dump 에 초점을 맞추었습니다. 그리고 macOS 기준으로 작성한 글이라 다른 OS환경과는 다르게 보일 수 있습니다. 1. 설치 및 실행 VisualVM홈페이지 에서 자신의 OS환경에 맞는 설치파일로 VisualVM 을 설치하실 수 있습니다. 처음 실행하면 아래 그림처럼 현재 자신의 로컬 환경에 실행 중인 JVM 어플리케이션들을 볼 수 있습니다. 이 어플리케이션들 중 하나를 예..
자바 HashMap의 capacity 는 왜 항상 2의 n승일까? HashMap 의 코드를 보면 capacity 의 초기값, 최댓값은 power of two( 2n ) 가 되어야 하고, resize 메소드 또한 power of two( 2n ) 의 값을 리턴한다고 적혀있습니다. openjdk11 코드를 사용하였습니다. // HashMap.java 코드 /** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1 > 16) & 25 -1 65,537 0000 0000 0000 0001 0000 0000 0000 0001 1 0 131,073 0000 0000 0000 0010 0000 0000 0000 0001 1 3 262,145 00..
자바 ArrayList 의 default size 는 10 맞을까? 언제부터인가 ArrayList 를 기본 생성자로 생성했을 때 default size 는 10으로 외우고 있었습니다. 혹여나 하는 마음에 코드를 가볍게 들여다봤는데 생각과는 달랐습니다. ArrayList 는 아래와 같이 동작하고 있었습니다. 1. 미리 만들어진 (static) 빈 배열로 초기화 2. 값을 한개라도 추가하면 default size 인 10 길이의 배열 할당 코드를 보면서 어떻게 구현이 되어있는지 확인해 보겠습니다. openjdk11 을 사용하였습니다. 기본 생성자를 사용했을 때 this.elementData 는 ArrayList 에서 데이터를 저장하는 1차원 배열의 변수입니다. ArrayList 의 기본 생성자를 따라가 보면 위와 같은 상수로 초기화되는 것을 볼 수 있습니다. 저 상수의 값을..
알면 유용한 Java 8, 9 에서 추가, 변경된 Collection 관련 내용 openjdk11 을 사용하였습니다. 1. removeIf Java 8 에서 Collection 인터페이스에 removeIf 메소드가 추가되었습니다. removeIf 를 사용하면 Collection 에서 특정 조건의 엘리먼트 삭제 시 코드를 간결하게 작성할 수 있습니다. ArrayList 는 Collection 인터페이스의 default removeIf 를 사용하지 않고 따로 구현하여 O(n) 의 시간복잡도로 설계된 로직을 사용하기 때문에 ArrayList 의 removeIf 를 사용한다면 성능 이점도 볼 수 있습니다. removeIf 를 사용하지 않으면 다음과 같이 작성할 수 있습니다. List list = new ArrayList(List.of("ABC", "BC", "DC", "AA")); // i..
자바 8 stream 의 lazy 자바 8에서 등장한 stream 은 lazy 로 동작합니다. lazy 는 연산이 필요할 때 연산을 한다는 의미입니다. lazy 는 stream 이 효율적으로 동작할 수 있게 하는 핵심입니다. 간단한 코드를 통해서 stream 을 사용했을 때와, for 문을 사용했을 때 연산 횟수(대략적인 성능)를 비교해 보고 lazy 가 어떻게 stream 을 효율적으로 동작할 수 있게 하였는지 알아보겠습니다. 연산 횟수 비교 문제: 주어진 (순서가 있는) 리스트에서 3 보다 크고 짝수인 첫 번째 수를 2배한 값을 구하세요. 기존의 for 문을 이용해 코드를 작성하면 연산 횟수가 몇 번인지 확인해 보겠습니다. "연산 횟수" 는 단순히 비교 연산을 몇 번 했는지, 곱하기 연산은 몇 번 했는지 정도를 나타냅니다. strea..
자바 8 람다는 익명 클래스와 같을까? 이 글은 Get a Taste of Lambdas and Get Addicted to Streams by Venkat Subramaniam 를 보고 일부 내용을 정리한 글입니다. 자바 8에서 람다가 등장하면서 Functional Interface 타입으로 익명 클래스 대신 람다를 사용할 수 있게 되었습니다. Functional Interface 는 한 개의 추상 메소드를 가진 인터페이스입니다. 원래 사용하던 익명 클래스를 사용해도 되고 람다를 사용해도 돼서 람다를 사용하면 컴파일러가 익명 클래스로 변환하여 익명 클래스를 사용할 때와 동일하게 동작한다고 오해할 수 있습니다. 내부적으로 어떻게 다르게 동작하는지 알아보겠습니다. 컴파일 결과 비교 익명 클래스를 사용한 코드를 컴파일하여 결과를 확인해보겠습니다...
서머타임(daylight saving time)에 대해 코드와 함께 알아보자 [이 글의 목적] 서머타임을 이해하고 서머타임으로 인해 발생할 수 있는 이슈를 공유 [서머타임(daylight saving time) 이란?] 서머타임은 특히 하절기에 국가의 표준시를 원래 시간보다 (일반적으로) 한 시간 앞당겨 사용하는 것을 말합니다. https://www.worlddata.info/timezones/daylightsavingtimes.php 미국 주식을 해보신 분들이라면 아마 "아~ 그거" 라고 하시면서 바로 아실 겁니다. 미국 주식 시장 시작 시각이 서머타임에 영향을 받는 대표적인 예 입니다. 2022년 미국 동부에서 서머타임으로 인해 시간 변경은 아래와 같습니다. (서머타임 시작) 03월 13일 02:00 -> 03월 13일 03:00 (서머타임 종료) 11월 16일 02:00 -..
AWS S3 + CloudFront + 커스텀 도메인(HTTPS) 웹사이트 배포하기 목표: HTTPS 가 적용된 커스텀 도메인으로 정적 파일 배포하기(S3 + CloudFront) 진행 절차 AWS Route53 에서 도메인 구입 AWS S3 버킷 생성 index.html 파일 생성하여 2번에서 생성한 S3 버킷에 업로드 구입한 도메인에 대한 인증서 발급 (AWS Certificate Manager) CloudFront 생성 AWS Route53에서 A 레코드 생성 도메인으로 index.html 접속 확인! 준비사항 AWS 에 가입된 아이디(카드 등록) 도메인을 구매할 비용 1. AWS Route53 에서 도메인 구입 AWS Route53 에 접속 [도메인] 메뉴 -> [등록된 도메인] 클릭 [도메인 등록] 버튼 클릭하면 도메인을 검색하고 구매할 수 있는 창이 나타납니다. 해당 창에서 ..