java (19) 썸네일형 리스트형 [Java] Reference Type(feat. strong, soft, weak) 하나의 프로세스에서 JVM heap memory는 할당량이 제한된다. 할당할 수 있는 데이터의 크기가 한정적이므로 사용하지 않을 데이터를 계속 메모리에 올려서 사용하는 것은 비효율적이고, 만약 데이터를 무한정 할당하게 된다면 메모리 공간이 부족해져 OOME가 발생할 것이다. 이를 관리해주는 것이 Garbage Collector다. 가비지컬렉터가 사용하지 않는 메모리 참조를 해제함으로써 메모리의 여유 공간을 확보하는 것이다. GC는 현재 참조하고 있지 않은 대상을 수집하여 메모리 공간을 확보하는데, 만약 크기가 큰 객체를 지속적으로 참조해야 상황이 생긴다면 어떻게 될까? 모두 GC 대상에서 제외될까? 만약 현재 참조하여 활용되고 있는 데이터는 모두 GC의 대상이 되지 못한다는 가설이 맞다면 다음의 문.. [Java] Dynamic Proxy란? n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까? 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. 서로 다른 클래스의 Proxy 클래스 구현을 추상화해야 한다. 마치며 이전 글 Proxy란?에서 Proxy를 만들어 구현 코드를 수정하지 않고 부가적인 기능을 추가시켰다. 부가적인 기능을 추가시키고 싶은 클래스의 Proxy 클래스를 직접 만들어 클라이언트가 proxy 클래스를 호출하도록 했다. 이 때 이런 문제가 있었다. 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 이 문제를 해결하기 위해 문제를 추상화해보자. 1. 부가적인 기능을 추상화하여 공통 코드로 만들어야 한다. (단순 Proxy 클래스 구현에서는 모든 Proxy 기능에 부가 기능 코드를 구현해야 했다) .. [Java] Proxy란? Proxy와 @Transactional '구현 코드를 수정하지 않고 부가적인 기능을 어떻게 수행할 것인가?' 'n개의 클래스에 대해 n개의 프록시 클래스를 만들어주어야 할까?' 다음 글 - Dynamic Proxy Proxy란 개념을 공부하게 된 계기는 Spring에서 @Transactional annotation이 어떻게 동작하는가를 알기 위해서였다. @Transactional annotation이 붙은 코드를 열심히 디버깅하여 따라가보니 다음과 같은 흐름을 볼 수 있었다. 클래스와 메서드에 집중하기 위해 메서드 파라미터나 기타 시그니처 코드들은 생략하였다. package org.springframework.aop.framework; class CglibAopProxy implements AopPr.. [Java] JNI(Java Native Interface)란? JNI란? JNI는 native code(C, C++, assembly 등)의 상호 운용을 위해서 만들어진 인터페이스다. JNI를 이용하면 JVM 내에서 실행되는 Java 코드로 native code 기반 애플리케이션이나 라이브러리를 상호 호출하여 사용할 수 있다. JNI의 장점은 native code로 작성된 코드를 활용하고자 할 때, 기존 Java로 제한된 코드의 구현에 영향을 미치지 않는다는 것이다. 이미 작성된 native code가 있다면, JNI를 이용하여 JVM 내에서 해당 코드가 정상적으로 작동하는 것을 보장하는 것이다. JNI 장단점 장점 - 하드웨어에 대한 동작을 native code로 제어할 수 있다 - 이미 native code를 사용해 구현한 라이브러리가 있을 때 Java에서 사용.. [Java] Thread Dump Thread Dump란? 문제상황1. 데드락 문제상황2. 처리 지연 Thread Dump란? 실행 중인 서버의 thread 상태의 snapshot을 획득하는 행위를 말합니다. 앞선 글 동시성 처리 - intro에서 살펴보았듯이 멀티스레드 환경에서 발생하는 여러 이슈들이 있습니다. 각 스레드가 어떤 상태에 놓여 있는지 thread dump를 활용하여 분석하면 어디서 문제가 발생하였는지 측정하여 이를 해결할 수 있습니다. 이번 글에서는 VisualVM을 활용해 특정 문제 상황들을 재현한 뒤 thread의 상태를 분석해보도록 하겠습니다. NaverD2 - 스레드 덤프 분석하기를 보면 jstack, JMC 등을 이용해 thread dump를 뜨면 로그 형태의 text로 각 thread의 정보를 확인할 수 있는데.. [Java] 테스팅 툴 - JMeter 앞선 글(모니터링 툴 - VisualVM)에서 JVM 기반의 서버 자원에 대한 모니터링 방법을 알아보았습니다. 이 때 클라이언트의 요청을 전달하기 위해 IDE(IntelliJ)에서 직접 수동으로 http 요청을 보내 서버가 request를 처리하도록 만들었습니다. 만약 동시에 얼마나 많은 요청을 처리할 수 있는지를 알아보기 위해서는 어떻게 요청을 보내야 할까요. http 요청을 여러번 수동으로 클릭하거나, 테스트 코드를 만들어 해당 요청을 여러 번 보낼 수 있도록 코드를 작성해야 할까요. 이러한 테스트를 자동화하기 위한 툴들이 있습니다. 이번 글에서는 Apache에서 오픈소스로 만든 'JMeter'의 활용에 대해서 살펴보도록 하겠습니다. JMeter JMeter는 application의 성능(perfor.. [Java] 모니터링 툴 - VisualVM JVM 기반의 서비스를 운영하면서 만약 OOME(OutOfMemoryError) 같은 메모리 관련 이슈가 발생하면 어떻게 문제를 분석해야 할까요? 어떤 객체가 메모리를 많이 잡아먹고 있는지 코드를 하나하나 분석하며 추측해볼 수도 있겠지만, 수만에서 수백만, 수억 라인이 되는 대규모 서비스의 코드를 일일이 분석하기란 불가능에 가까울 것입니다. 그렇기에 서비스를 운영할 때는 문제를 더 쉽고 빠르게 파악할 수 있도록 모니터링 툴을 활용하고 있습니다. 위와 같은 메모리 관련 이슈가 발생했다면 JVM의 메모리가 어떻게 관리되고 있는지 확인하고 싶을 것입니다. 다양한 상용 툴이 있지만 Oracle에서 지원하는 오픈소스 기반의 VisualVM을 활용해 설명해보도록 하겠습니다. VisualVM 모니터링을 위한 Cont.. [Java] 동시성 처리 - Lock Algorithms(락 알고리즘) 이전 글 [Java] 동시성 처리 - intro 앞선 글에서 자바의 동시성을 이야기하며, 자바에서의 Lock 사용법을 위주로 설명하였습니다. 자바 내장 모듈이 기본적으로 지원하는 API를 활용해서 동시성을 처리한다면, 까다로운 구현 없이 처리할 수 있을 것입니다. 하지만 각 API가 어떻게 성능을 개선해왔는지를 이해하기 위해서는 그 작동방식에 대해서 이해해야 할 필요가 있습니다. 이를 위해 이번 글에서는 일반적인 lock algorithm에 대해서 살펴보고자 합니다. 그 전에 blocking과 non-blocking에 대해서 먼저 살펴보고자 합니다. 각 알고리즘들은 상황에 따라 blocking과 non-blocking 개념을 적절히 활용하여 구현되고 있기 때문입니다. Blocking - Non-Block.. 이전 1 2 3 다음