분류 전체보기 (46) 썸네일형 리스트형 [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에서 사용.. File Descriptor 제한 테스트(feat. ulimit, JMeter, VisualVM) 이전 글 테스팅 툴 - JMeter와 모니터링 툴 - VisualVM에서 어플리케이션을 테스트하고 어플리케이션이 사용하고 있는 자원을 모니터링하였다. JMeter 문서에 나오는 best practices에서 정확한 테스트를 위해 thread 수를 적절히 설정해야 할 필요가 있다고 나와 있었는데, 당시에는 그러면 얼마만큼의 thread 수가 적절한가? 하는 의문이 들었다. File Descriptor, ulimit을 공부하며 어떤 영향이 있는지 알 수 있는 테스트를 할 수 있었다. 이번 글은 그 테스트에 대한 글이다. Spring Boot Application Server SlowController를 하나 만들어 각 루트 요청이 Thread를 5초간 sleep 하도록 만들었다. @RestController.. File Descriptor란? "하나의 서버 컴퓨터가 요청을 몇 개나 맺을 수 있을까요?" 답변을 하지 못했다. 아마 성능이 매우 좋은 cpu, ram, disk를 쓰면 요청을 많이 맺을 수 있지 않을까 생각했다. 물론 하드웨어적인 요소들이 서버가 맺을 수 있는 요청의 수에 영향을 주겠지만, Unix-like OS 관점에서 볼 때 모든 요청이 파일로 관리되기 때문에 '파일을 얼마나 생성해낼 수 있는가?'가 하나의 지표로 활용될 수 있을 것이다. 여기서 요청이라 하면 sockets, network I/O, disk I/O 등 다양한 인터페이스를 가리킨다. 소켓을 열거나 네트워크 연결을 수립할 때, 파일을 열거나 디스크 장치에 접근할 때도 file descriptor가 생성된다. 현재 사용하고 있는 노트북이 macOS이므로 file de.. [Java] Thread Dump Thread Dump란? 문제상황1. 데드락 문제상황2. 처리 지연 Thread Dump란? 실행 중인 서버의 thread 상태의 snapshot을 획득하는 행위를 말합니다. 앞선 글 동시성 처리 - intro에서 살펴보았듯이 멀티스레드 환경에서 발생하는 여러 이슈들이 있습니다. 각 스레드가 어떤 상태에 놓여 있는지 thread dump를 활용하여 분석하면 어디서 문제가 발생하였는지 측정하여 이를 해결할 수 있습니다. 이번 글에서는 VisualVM을 활용해 특정 문제 상황들을 재현한 뒤 thread의 상태를 분석해보도록 하겠습니다. NaverD2 - 스레드 덤프 분석하기를 보면 jstack, JMC 등을 이용해 thread dump를 뜨면 로그 형태의 text로 각 thread의 정보를 확인할 수 있는데.. Timeout이란? - Connection Timeout / Read Timeout 타임아웃이란? timeout은 특정 이벤트를 완료하는 데 할당된 제한 시간입니다. 이 제한 시간 안에 특정 이벤트가 완료되지 않으면 보통 'timed out' 되었다고 말합니다. 즉, timeout은 '제한시간' 그 자체를 나타내고, timed out은 제한 시간 내에 완료되지 못한 상태에 가깝습니다. 따라서 개발을 할 때 보통 timeout을 세팅하고, 그 시간 내에 처리되지 못하면(timed out) 어떤 조치를 취할 것인가를 구현하는 것이 일반적입니다. 이 때, 위에서 말한 특정 이벤트란 다음과 같이 network layer, application layer 두가지 계층으로 나누어 볼 수 있습니다. Network layer 서버 간 TCP/IP 통신은 먼저 connection을 수립하고 이루어집니다.. 이전 1 2 3 4 5 6 다음