개발/BE 5

Spring에서 외부 API 호출하기(WebClient 사용)

이번에 클라이언트와 내부 서버들의 통신을 위한 중간 서버를 만들기 위해 Spring기반의 서버 내부에서 타 서버로의 API 호출이 필요했다. 가장 최근에 도입된 WebClient 활용 그거 말고는 아래 방식들이 있음 1. HttpURLConnection 스프링이나 외부 라이브러리가 아닌 Java 표준에서 제공하는 HTTP Connection 클래스이다. URLConnection을 상속받고있음 옛날옛적에 사용하던거 2. RestTemplate Spring 3.0부터 도입된 클래스로, 동기적인 HTTP 통신을 위해 쓰인다. 3. WebClient 비동기/논블로킹 방식을 지원 리액티브 프로그래밍이 가능하며 데이터 스트림을 효과적으로 처리할 수 있음 등등... 프로젝트 구조는 다음과 같이 잡아보았다 common..

개발/BE 2024.03.12

[Java] Heap Memory 누수 분석기4 : dump파일 분석(MAT)

이전 글에서 이어집니다 : [Java] Heap Memory 누수 분석기3 : 누수 원인을 분석해보자 - jmap, jhat 그래서 메모리 누수 원인은 뭐였을까? MAT를 통해 뜬 덤프 파일을 분석해보았다. .hprof 파일을 열면 다음과 같이 확인해볼 수 있다. 딱 봐도 저 파란 부분이 메모리를 왕 잡아먹고 있는 것으로 보인다. Leak Suspects라는 탭을 클릭하면 메모리 누수 원인을 MAT가 예측해준다. 역시나 Finalizer가 문제였던 것으로 보인다. 그래서 Finalizer는 뭐냐 ? 메모리 해제/GC를 담당하는 객체이다. (참고링크 : https://ivvve.github.io/2019/06/05/java/ETC/fileiostream-finalizers/) finalize() 메서드가 ..

개발/BE 2024.03.11

[Java] Heap Memory 누수 분석기3 : 누수 원인을 분석해보자 - jmap, jhat

이전 포스팅에서 이어집니다. : [Java] Heap Memory 누수 분석기2 : 모니터링 환경 구축하기 - VisualVM 그래서 VisualVM을 이용하면 로컬 환경에서는 테스트해볼 수 있었는데 사실 그것만으로는 상용 환경에서의 메모리 누수 원인을 확정하기에는 근거가 너무 부족했다. 그래서 jmap 명령어를 이용해서 Heap Dump파일을 생성해보기로 하였다. Heap Dump Heap Dump 뜨는 방법으로 jmap 과 jcmd 가 있음 jmap : GC를 동반하지 않고, 죽은 객체까지 포함하여 인스턴스의 점유율을 보여준다. jcmd 와 같이 full GC를 발생시키고싶으면 -live 옵션을 붙이면 된다 jcmd : Full GC를 발생시킨 후 살아있는 인스턴스의 점유율만 보여줌 처음에는 이 명령..

개발/BE 2024.03.01

[Java] Heap Memory 누수 분석기2 : 모니터링 환경 구축하기 - VisualVM

이전 글에서 이어집니다 : [Java] Heap Memory 누수 분석기1 : JVM이란 ? 그래서 JVM이 뭔지 대략적으로 알았으니 내 프로그램에서 이 JVM이라는 녀석이 어떻게 돌아가고 있는지 확인해보려고 한다. 일단 여러가지 모니터링 툴이 있다고 해서 써봤는데, 분석이 쉽지 않았다. (첨에는 InteliJ에 내장되어있는 Profiler를 통해서 보려고 했으나 서비스 프로세스에 부하 좀만 주면 프로세스 다운 전에 InteliJ 자체의 메모리가 터져서 죽어버렸다 ;;;) 가장 간편한 방법은 바로 힙 덤프를 떠서 확인해보는거였지만, 고객들에게 제공되고있는 서비스였기때문에 막 덤프 떠버리기는 좀 부담이 있었다. 특히 구글링 중 봤던 아래 문구때문에 힙덤프는 마지막 후순위로 미루고싶었음 ❗주의!! 힙 히스토..

개발/BE 2024.02.28

[Java] Heap Memory 누수 분석기1 : JVM이란 ?

구축해둔 모니터링 시스템 통해 간헐적으로 알림이 오기 시작했다. 서버 구동한지 한달정도 지나니 초기에 40%정도였던 힙메모리 사용률이 지속적으로 70%대를 돌파하고있었다. 왜 그런고 하니,,, 대충 이런 모양새였다 (마우스패드로 그려서 이상함) minorGC가 일어나면서 간헐적으로 메모리 영역이 줄어들지만 메모리가 제대로 해제되지 못한(=누수가 일어나는 부분의) 객체들이 차지하는 메모리가 지속적으로 쌓이면서 평균적인 메모리 사용률이 올라가게 된 것이다. 하지만 기존에 구축되어있던 모니터링 도구로는 어떤 객체가 메모리를 잡아먹는지나,, 상세한 시간대별 힙메모리 소모율 등등은 볼 수 없었다. 그래서 모니터링 환경을 추가적으로 구축하려고 했다. 대충 알아보니 다음과 같은 방법들이 있더라 VisualVM He..

개발/BE 2024.02.27
728x90