JVM은 Heap 영역 외에도 다양한 메모리 영역을 사용
당시 시스템에는 MIP(Microsoft Information Protection) 기능이 신규 적용된 상태였음
암호화 과정에서 MIP API와 지속적으로 통신이 발생
장애 흐름은 다음과 같았음.
대량 문서 암호화
↓
MIP API 네트워크 통신 증가
↓
Direct Buffer 사용량 급증
↓
Native Memory 고갈
↓
java.lang.OutOfMemoryError: Direct buffer memory
↓
Tomcat 종료

OOM이라고 해서 항상 Heap Memory 부족을 의미하는 것은 아님.
JVM 프로세스는 다음과 같은 메모리 영역을 함께 사용함.
JVM Memory
├── Heap
│ └── Java 객체 저장
│
├── Non-Heap
│ ├── Metaspace
│ ├── Code Cache
│ └── Direct Buffer
│
└── Thread Stack
-Xms8192m
-Xmx8192m
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:MaxDirectMemorySize=1024m
-Xss512k
-XX:ReservedCodeCacheSize=256m
특히 Direct Buffer 사용량을 명시적으로 관리하기 위해 다음 옵션을 추가함.
-XX:MaxDirectMemorySize=1024m
Direct Buffer Memory OOM 로그 예시
java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:695)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
해당 로그가 발생한다면 Heap Memory가 아닌 Native Memory 영역의 사용량도 함께 확인해 보는 것이 좋음.