개요자바에서 컬렉션을 순회하는 방법은 다양하다. 대표적으로 for 루프, 향상된 for 루프(Enhanced For), Iterator, 그리고 ListIterator가 있다. 각각의 방법은 성능이나 코드의 간결성 측면에서 차이가 있는데 단순히 ~는 객체지향적이기에 사용하면 좋고, ~는 성능이 안좋아서 개선 버전이 있으니 무조건 향상된 for 문을 쓰자 를 넘어서 직접 운영중인 api 의 알고리즘을 대상으로 테스트를 해본다. 이번 글에서는 이러한 순회 방법들이 실제로 얼마나 성능 차이가 나는지, 어떤 상황에서 특정 방법을 사용하는 것이 유리한지에 대해 이야기를 해보려한다. 테스트 대상 특성 성능 테스트는 일정 관리 시스템에서 일정을 순회하며 각 일정의 타입을 계산하는 과정으로 1. 리스트에 삽입/..
Java
개요자바를 공부하다보면 가비지 컬렉터(GC)에 대해 자주 접하게 된다. 대부분 GC과정이 메모리 관리를 위해 사용된 객체를 해제하고 메모리 관리를 최적화 하기 위해서 여러 세대로 나누어 자주 접근하거나 다른 객체들에 의해 참조되는 객체들은 오래된 세대로 이동하여, 신세대에 비해 해제 빈도를 낮추는 전략을 사용한다. 정도로만 이해하고 있을 수 있는데, 요즘 'JVM 밑바닥까지 파헤치기' 라는 책을 읽으며 GC의 작동 원리는 이보다 훨씬 더 복잡하고 여러 과정을 거쳐서 발전해왔음을 확인할 수 있었다. 따라서 이번 포스팅에서는 용어와 알고리즘을 정리한후에 클래식 가비지 컬렉터의 특성과 종류를 시작으로 ZGC나 쉐넌 도어같은 최신 가비지 컬렉션 기술까지 특성 위주로 설명을 해보려고 한다. 용어 - Stop..
개요자바가 제공하는 메모리 관리는 할당과 해제를 하여 관리해야하는 다른 언어들과는 달리 개발자의 편의성 측면에서 많은 이점을 가져온다. 하지만 그 이면으로 내가 직접 관리를 하지 않기 때문에 GC 과정에 이상이 생길시에 원인을 분석하여 해결해야된다는 점이 있는데 이는 자바가상머신의 메모리에 대해서 알아보면 원인 분석 및 이해가 빨라질수 있다.따라서 이를 구조를 설명하고 구조별로 일어날만한 오류들을 정리를 해보려한다.(고봉밥으로다가) 들어가기에 앞서서 JVM 을 크게 나눠보자면 위에도 언급했던 힙 메모리를 관리하는 가비지 컬렉터, 자바 클래스를 메모리 영역(어디인지는 아래에 나올것이다.) 에 로드해주는 클래스 로더 시스템, JVM의 바이트 코드를 실행하는 실행 엔진으로 기능적 요소가 존재하고 이번에 설명할..
개요JVM의 메모리 영역 구성 요소중 하나인 자바가상머신 스택에 대한 이해를 위해 예제를 통해 각 구역에 데이터가 할당되고 해제되는것을 javap 명령어를 통해 알아본다. *해당 포스팅에서 나오는 상수풀은 런타임 상수풀이 아니라 클래스 상수풀이다. JVM이 클래스 로드시에 클래스 상수풀 내의 파일이 런타임 상수풀에 적재된다.실습 코드 준비 및 컴파일public class BytecodeExample { public static void main(String[] args) { int a = 5; int b = 10; int result = addAndMultiply(a, b); System.out.println(result); } publ..
목차 개요JVM의 메모리 구조 이해를 위한 글로 두 메서드의 실행 차이점을 알아본다.Java 9 이전보다 최근들어서는 자바로 쓰인 라이브러리의 종류도 많아져 잘 사용하지 않기에 사용이 적다. 이펙티브 자바에서도 최대한 네이티브 메서드의 실행을 지양하고 있다. 하지만 해당 내용이 JVM 의 구조를 이해하기에 도움이 되기에 간단히 적어본다. 자바 네이티브 인터페이스(Java Native Interface, JNI) -> 자바 프로그램이 네이티브 메서드를 호출하는 기술네이티브 메서드 -> C나 C++같은 네이티브 프로그래밍 언어로 작성한 메서드네이티브 메모리 -> 자바가 실행되고 있는 운영체제의 메모리, 운영체제에 의해 관리되기에 자바 힙보다 확장성이 좋다.*네이티브 메모리는 네이티브 메서드의 실행에만 국..
목차 개요 스프링 그리고 Java를 사용하다 보면 null 값 핸들링이 무척 중요하다는 사실을 깨닫고 적절한 처리에 대해 고민을 하게 된다. 특히 NullPointerException의 발생 또한 자주 접하게 된다. Java에서는 이러한 문제를 해결하기 위해 Optional 클래스를 도입했다. Optional (Java Platform SE 8 ) A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or a..