
메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다. 이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다. 그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다. 메모리 누수가 발생할 수 있는 대표적인 상황 3가지 Stack -> Array Cache -> Map Listener -> List 위 3가지 예제 모두 공통적으로 필드로 객체를 쌓아두는 공간이 있다. 즉, 자기 메모리를 직접 관리하기 때문에 메모리 누수에 취약한 것이다. 객체를 쌓아두는 공간에 활성 영역에 속한 요소들은 사용되고 비활성 영역은 쓰이지 않는데 문제는 가비지 컬렉터가 이 사실을 알 길이 없다. 가비지 컬렉터가 보기에는 비활성 영역에서 참조하는 객체도 똑같..

표준과 구현이 우리가 개발하는 환경에서 어디서 어떻게 쓰이는지 살펴보자. 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를 개발한 ..

Java에서 warm up을 하는 이유에 대해서 살펴보기 위해서는 JVM의 특성에 대해서 알아볼 필요가 있다. JVM 작성된 Java 코드에 대해 1차적으로 중간언어로 컴파일을 해야한다. 주로 Byte Code는 jar이나 war 파일로 아카이브하여 활용하게 될텐데 빌드된 파일을 실행하게 되면 JVM에서는 바이트 코드를 번역하여 기계어로 만들고 이 기계어를 CPU에서 처리하는 절차는 갖는다. 이렇게 빌드된 바이트 코드는 별도의 추가 빌드없이 자바가 실행 가능한 CPU 아키텍처, 즉 여러 OS에서 실행할 수 있는 장점이 있다. 이렇게 자바는 compile과 interpret라는 두 가지 동작에 의해 실행되는 하이브리드 언어이다. 그러다보니 컴파일 과정에서 바로 기계어를 만드는 C/C++, Rust, Gol..

clone() 메서드 clone() 메서드는 특정 클래스의 인스턴스를 복제하여 새로운 인스턴스를 생성하려고 할 때 사용한다. clone()을 사용하면 이전의 값은 보존되고, 작업에 실패해서 원래의 상태로 되돌리거나 변경하지 전의 값을 참고하는데 도움이 된다. clone은 Object 클래스에 정의되어 있는데 단순히 인스턴스의 값을 복사하기 때문에 참조 타입의 필드가 있는 클래스는 완전한 복제가 이루어지지 않는다. Cloneable 인터페이스의 clone 메서드 살펴보기 API 문서의 clone 메서드에 대한 내용을 살펴보면 다음과 같다. Object 클래스에 대한 clone 메서드는 특정 복제 작업을 수행한다. 먼저, 클래스가 Cloneable 인터페이스를 구현하지 않는 경우에는 CloneNotSuppo..

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 클래스를 작성..

ConcurrentHashMap HashMap은 싱글스레드 환경에서 사용하는 것이 좋고, 멀티스레드 환경에서는 동기화 처리를 하지 않기 때문에 thread-safe하지 않다. 이 문제를 해결하기 위해서 Collections.synchronizedMap 메서드로 원본 Map을 변환하거나 HashTable 자료구조를 사용할 수 있지만 단일 잠금 객체를 사용하기 때문에 이러한 배타적 접근방식은 성능저하를 일으킬 수 있다. 즉, 높은 동시성 하에 수많은 처리량으로 thread-safe를 원한다면, 이러한 구현은 해결책이 되지 못한다. 이러한 동기화 문제를 보완하기 위해서 Java 1.5에서 ConcurrentMap이 도입되었다. 동기화 처리를 할 때, 어떤 Entry를 조작하는 경우에 해당 Entry에 대해서만..

volatile 하나의 변수를 여러 스레드에서 사용할 때 사용하는 키워드로 변수를 CPU 캐시가 아닌 Main Memory에서 변수의 값을 읽거나 저장하겠다라는 것을 명시하는 것이다. 즉, volatile은 CPU Cache에 저장된 값을 읽는 것 보다는 성능이 안좋지만 컴파일러에게 해당 데이터(변수, 메서드)에 대해 멀티스레드로 접근하고 있음을 알려주어 읽기, 쓰기에 대해서 동기화를 보장하여 예측불허하게 바뀌는 것을 막을 수 있다. synchronized와의 차이는 다음과 같다. synchronized: 행위(메서드 및 블럭)에 대한 동기화 volatile: 행위의 타겟(변수)에 대한 동기화 volatile을 사용하는 이유는 Main Memory의 값을 읽고 저장해 가시성을 보장하기 위한 것이라고 할 ..

Thread 우리가 JVM을 실행시키면 자바 프로세스(Java Process)가 시작한다. 이 프로세스에는 여러 개의 스레드가 수행되는데 반대로 여러 프로세스가 공유하는 하나의 스레드가 수행되는 일은 절대 없다. 어떤 프로세스든 간에 스레드가 하나 이상 수행된다. 프로세스(Process): 운영체제로부터 시스템 자원을 할당받아 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체) 스레드(Thread): 프로세스가 할당받은 자원을 이용하는 실행의 단위 이 때, Java Thread는 일반 스레드와 거의 차이가 없으며, JVM이 운영체제의 역할을 한다. 즉, Java Thread는 JVM에 의해 스케되는 실행 단위 코드 블록이라고 할 수 있고, 스레드 스케줄링 및 스레드와 관련된 많은 정보들을 ..

Garbage Collection(가비지 컬렉션) 프로그램을 개발하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 하지만 Java나 JavaScript을 이용해 개발을 하다보면 개발자가 메모리를 직접 해제해주는 일은 없다. 그 이유는 JVM의 Garbage Collector가 프로그램이 동적으로 할당했던 메모리 영역 중 불필요한 메모리를 알아서 정리(해제)해주기 때문이다. 여기서 동적으로 할당했던 메모리 영역은 프로그램 런타임에 사용되는 Heap 메모리 영역을 뜻하고, 불필요한 영역은 어떤 변수도 가리키지 않게 된 영역을 의미한다. 장점 이렇게 GC를 도입하면 수동으로 메모리를 관리하던 것에서 비롯된 에러들..
- Total
- Today
- Yesterday
- 트랜잭션
- 구름톤챌린지
- jvm 메모리 구조
- 구름톤 챌린지
- 비관적 락
- Redisson
- postgresql
- Java
- spring session
- EKS
- 분산 락
- NeXTSTEP
- nginx configuration
- spring webflux
- pessimistic lock
- Kafka
- redis session
- 카프카
- 넥스트스탭
- sql
- TDD
- Synchronized
- transaction
- nginx
- mysql
- 람다
- annotation
- mdcfilter
- socket
- 낙관적 락
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |