caffeine-library / release-everything

'Release의 모든 것'을 읽는 스터디
3 stars 0 forks source link

[question] 4장 - 검은 월요일 사례의 문제원인에 대해서 #13

Closed kth990303 closed 9 months ago

kth990303 commented 9 months ago

질문

p.140~142 에 안내되어 있는 검은 월요일 이슈의 원인이 궁금합니다. 제가 이해한 바로는, SQL 절에 limit 구문을 붙이지 않아 매우 많은 row를 포함하는 결과를 반환하여 이에 따른 객체를 만드려다가 OOM이 나서 비정상 종료가 된 것인데요. p.141에서 네이티브 코드로 인해 OutOfMemoryError 오류가 발생한다고 안내가 되어있더라고요.

이번 사례는 native method로 인한 비정상 종료라기보단, limit 구문 미사용으로 인한 메모리 과다 사용으로 비정상 종료가 된 것으로 보이고, native method는 단순 지식 공유를 위해 존재하는 문구라고 생각했어요.

제가 이해한 게 맞는지, 아니면 native method로 인해 비정상 종료가 된 사례를 언급하는게 맞는데 제가 잘못 이해하고 넘겨짚는 것인지 궁금하여 여러분들과 함께 얘기나누고 싶어졌습니다!

연관 챕터

7


@caffeine-library/readers-release-everything

JasonYoo1995 commented 9 months ago

p.109에 아래와 같은 내용이 있습니다

C#, 자바, 루비 같은 런타임 언어는 프로세스가 갑자기 죽는 일이 거의 없다. 물론 애플리케이션 오류는 발생한다.

p.140에는 아래 내용이 있습니다.

인스턴스는 괜찮았지만 몇 분이 지나자 CPU를 100% 사용하려 했다. 3~4분 후엔 자바 가비지 컬렉터인 핫스팟(HotSpot)의 메모리 오류로 인해 프로세스가 갑자기 종료되었다.

p.141에는 아래 내용이 있습니다.

보통 JVM의 메모리가 부족하면 OutOfMemoryError 오류가 발생한다. 어떤 네이티브 코드가 실행 중에 malloc()을 호출한 후 NULL을 확인하지 않을 때나 비정상 종료가 일어난다. 유일한 네이티브 코드는 타입 2 JDBC 드라이버에 있었다. (각주 32참고)

p.141의 각주 32에는 아래 내용이 있습니다.

JVM에서도 네이티브 코드를 호출하며 여느 C 프로그램처럼 오류 대신 비정상 종료가 발생할 수 있다

이러한 내용들을 종합해보면 일반적으로 Java 기반의 서버는 에러로 인해 서버가 죽는 일이 거의 없으나 JVM이 native code를 실행했고, native code에서 에러가 발생해서 비정상 종료가 발생하는 드문 일이 발생했다고 해석해볼 수 있을 것 같습니다.

native code에서 에러가 발생한 이유는 JDBC Driver의 코드 중에서 malloc()로 메모리를 할당 시도했으나 실패한 경우에 핸들링하는 로직이 미흡하여 발생한 게 아닐까 추측해봅니다.

kth990303 commented 9 months ago

아하, 그럼 둘은 서로 아예 무관한 이슈는 아닌거같네요.

결국 DB에서 조회한 결과들을 객체로 생성할 때 라든지 등 케이스에서 JDBC 드라이버 로직을 탈 것이고, JDBC 로직 구현에 따라 native method 호출하면서 메모리 관련 이슈가 발생 가능(즉 비정상 종료 이슈 발생 가능) 및 이에 따른 핸들링 처리 미숙에 따라 비정상 종료가 발생할 수 있어 보이네요!

감사합니다.