본문 바로가기

Java59

Finalizer와 Cleaner가 아닌 AutoCloseable을 사용하자 finalizer와 cleaner는 기본적으로 자원을 반납할 때 사용하는데 둘 모두 우리가 원하는 순간에 실행된다는 보장이 없다. 자원을 반납해야 하는 이유 OS마다 open할 수 있는 개수가 제한이 되어있다. 파일을 open할 때마다 파일 핸들러라는 것이 만들어지는데 쉽게 생각하면 id라고 보면 된다. 이렇게 파일을 너무 많이 open하면 리눅스 기준 "Too many open files" 에러가 발생하게 된다. 이러한 에러가 발생하는 이유 중 하나로 InputStream, OutputStream 같은 자원을 제대로 반납하지 않는 경우 즉, 열려있는 커넥션을 제대로 정리해주지 않기 때문에 발생한다. 따라서 자원을 잘반납하라고 만든 것이 finalizer와 cleaner이지만 의도와 다르게 제목처럼 사용.. 2023. 8. 10.
JVM 메모리 구조 JVM 성능에 관심이 있다면 기본적인 JVM 기술 스택의 구조를 이해해야 할 필요가 있다. JVM 기술을 이해하면 더 좋은 소프트웨어를 개발할 수 있고 성능 이슈를 탐구할 때 필요한 이론적 배경지식을 갖추게 된다. 따라서 JVM이 나오게 된 배경부터 자바 코드를 실행하는 방법에 대해서 알아보자. JVM이 나온 배경 JVM 이전 C/C++ 문제점 위 그림처럼 리눅스에서 컴파일해서 나온 실행파일을 윈도우에서 돌리게 되면 안돌아간다. C/C++는 컴파일 플랫폼과 타겟 플랫폼(= 운영체제 + CPU 아키텍쳐)이 다를 경우, 프로그램이 동작하지 않는다는 문제가 있었다. 이를 해결하기 위해서 크로스 컴파일이라고 하는 것이 나왔다. 이 '크로스 컴파일'은 타겟 플랫폼에 맞춰 컴파일하는 것을 말한다. 이 덕분에 리눅스.. 2023. 8. 9.
LRU 알고리즘 이용한 메모리 직접 관리하는 In-memory 캐시 LRU 알고리즘 LRU 알고리즘은 페이지 교체 알고리즘 중 하나로 사용되는 가장 오랫동안 참조되지 않은 페이지를 교체하는 기법을 말한다. 캐시가 사용하는 리소스의 양은 제한되어 있고, 캐시는 제한된 리소스 내에서 데이터를 빠르게 저장하고 접근할 수 있어야 한다. 이러한 LRU 알고리즘은 다음과 같은 특징을 갖는다. 장점 빠른 액세스: 가장 최근에 사용한 요소부터 가장 적게 사용한 요소까지 정렬된다. 따라서 요소에 접근할 경우, O(n)의 시간 복잡도를 가진다. 빠른 Update: 하나의 요소에 액세스할 때마다 업데이트되며, O(n)의 시간 복잡도를 가진다. 단점 많은 공간을 차지한다. N개의 요소를 저장하는 LRU는 N의 크기를 가지는 1개의 LinkedList(Queue)와 이를 추적하기 위한 N의 크.. 2023. 8. 6.
메모리 정리하는 방법(null, Weak/SoftReference, Background Thread, 메모리 직접 관리) 메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다. 이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다. 그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다. 메모리 누수가 발생할 수 있는 대표적인 상황 3가지 Stack -> Array Cache -> Map Listener -> List 위 3가지 예제 모두 공통적으로 필드로 객체를 쌓아두는 공간이 있다. 즉, 자기 메모리를 직접 관리하기 때문에 메모리 누수에 취약한 것이다. 객체를 쌓아두는 공간에 활성 영역에 속한 요소들은 사용되고 비활성 영역은 쓰이지 않는데 문제는 가비지 컬렉터가 이 사실을 알 길이 없다. 가비지 컬렉터가 보기에는 비활성 영역에서 참조하는 객체도 똑같.. 2023. 8. 6.
표준과 구현 표준과 구현이 우리가 개발하는 환경에서 어디서 어떻게 쓰이는지 살펴보자. JCP, JSR, TCK, JDK JCP, JSR, TCK란 무엇인가 The Java Community Process(SM) Program Welcome to jcp.org, home of the Java Community ProcessSM (JCPSM) Program. The JCP is the mechanism for developing standard technical specifications for Java technology. Anyone can register for the site and participate in reviewing and providing feedback fo www.jcp.org Java를 개발한 .. 2023. 7. 31.
JMH로 warm up 후 테스트하기 Java에서 warm up을 하는 이유에 대해서 살펴보기 위해서는 JVM의 특성에 대해서 알아볼 필요가 있다. JVM 작성된 Java 코드에 대해 1차적으로 중간언어로 컴파일을 해야한다. 주로 Byte Code는 jar이나 war 파일로 아카이브하여 활용하게 될텐데 빌드된 파일을 실행하게 되면 JVM에서는 바이트 코드를 번역하여 기계어로 만들고 이 기계어를 CPU에서 처리하는 절차는 갖는다. 이렇게 빌드된 바이트 코드는 별도의 추가 빌드없이 자바가 실행 가능한 CPU 아키텍처, 즉 여러 OS에서 실행할 수 있는 장점이 있다. 이렇게 자바는 compile과 interpret라는 두 가지 동작에 의해 실행되는 하이브리드 언어이다. 그러다보니 컴파일 과정에서 바로 기계어를 만드는 C/C++, Rust, Gol.. 2023. 7. 31.
Object 클래스의 clone() 메서드 clone() 메서드 clone() 메서드는 특정 클래스의 인스턴스를 복제하여 새로운 인스턴스를 생성하려고 할 때 사용한다. clone()을 사용하면 이전의 값은 보존되고, 작업에 실패해서 원래의 상태로 되돌리거나 변경하지 전의 값을 참고하는데 도움이 된다. clone은 Object 클래스에 정의되어 있는데 단순히 인스턴스의 값을 복사하기 때문에 참조 타입의 필드가 있는 클래스는 완전한 복제가 이루어지지 않는다. Cloneable 인터페이스의 clone 메서드 살펴보기 API 문서의 clone 메서드에 대한 내용을 살펴보면 다음과 같다. Object 클래스에 대한 clone 메서드는 특정 복제 작업을 수행한다. 먼저, 클래스가 Cloneable 인터페이스를 구현하지 않는 경우에는 CloneNotSuppo.. 2023. 7. 30.
JMX(Java Management eXtensions)와 VisualVM로 Heap Dump 들여다보기 JMX JMX(Java Management eXtentions)는 Java 응용프로그램의 모니터링과 관리기능을 제공한다. 웹사이트를 통해 원격의 Web Server, WAS, DB 등의 상태 모니터링, Start, Stop 등의 기능, 디바이스 상태, 각종 서비스제어 등의 기능을 제공할 수 있다. JMX 기술을 사용하여 리소스를 관리하려면 Java 프로그래밍 언어로 리소스를 관리해야 하는데, 리소스 관리 주체인 MBeans로 알려진 Java 객체를 사용하여 리소스를 관리한다. JMX MBean JMX의 MBean은 JMX Agent를 통해 관리되는 응용프로그램 또는 시스템 리소스이다. 표준 MBean은 XXXMBean이라는 Java 인터페이스와 해당 인터페이스를 구현하는 XXX라는 Java 클래스를 작성.. 2023. 7. 24.
ConcurrentHashMap vs synchronized HashMap, ConcurrentHashMap 구현해보기 ConcurrentHashMap HashMap은 싱글스레드 환경에서 사용하는 것이 좋고, 멀티스레드 환경에서는 동기화 처리를 하지 않기 때문에 thread-safe하지 않다. 이 문제를 해결하기 위해서 Collections.synchronizedMap 메서드로 원본 Map을 변환하거나 HashTable 자료구조를 사용할 수 있지만 단일 잠금 객체를 사용하기 때문에 이러한 배타적 접근방식은 성능저하를 일으킬 수 있다. 즉, 높은 동시성 하에 수많은 처리량으로 thread-safe를 원한다면, 이러한 구현은 해결책이 되지 못한다. 이러한 동기화 문제를 보완하기 위해서 Java 1.5에서 ConcurrentMap이 도입되었다. 동기화 처리를 할 때, 어떤 Entry를 조작하는 경우에 해당 Entry에 대해서만.. 2023. 7. 24.