중간 정도의 부하에서 Java 프로세스의 메모리 사용량을 조사하려고합니다.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12663 test 20 0 8378m 6.0g 4492 S 43 8.4 162:29.95 java
보시다시피 6Gb의 상주 메모리가 있습니다. 이제 흥미로운 부분은 다음과 같습니다. 프로세스는 다음 매개 변수로 실행됩니다.
- -Xmx2048m
- -Xms2048m
- -XX : NewSize = 512m
- -XX : MaxDirectMemorySize = 256m
- ... GC와 다른 것들을위한 다른 것들
이러한 설정과 실제 메모리 사용량을 살펴보면이 프로세스에서 사용할 것으로 예상되는 것과 실제로 사용하는 것의 차이를 발견하게됩니다.
일반적으로 메모리 덤프는 힙 덤프를 분석하여 해결되지만이 경우 메모리는 힙 외부 어딘가에 사용됩니다.
질문 : 메모리 사용량이 많은 이유를 찾고 시도하는 단계는 무엇입니까? 해당 프로세스에서 메모리를 사용하는 것을 식별하는 데 도움이되는 도구는 무엇입니까?
편집 0
아직 공간이 충분하기 때문에 힙 관련 문제 인 것처럼 보이지 않습니다.
jmap -heap 12663
결과 (공간 절약을 위해 편집)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 1610612736 (1536.0MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
New Generation: 45.7% used
Eden Space: 46.3% used
From Space: 41.4% used
To Space: 0.0% used
concurrent mark-sweep generation: 63.7% used
Perm Generation: 82.5% used
편집 1
pmap을 사용하면 64Mb의 할당량이 상당히 있음을 알 수 있습니다.
pmap -x 12663 | grep rwx | sort -n -k3 | less
결과 :
... a lot more of these 64Mb chunks
00007f32b8000000 0 65508 65508 rwx-- [ anon ] <- what are these?
00007f32ac000000 0 65512 65512 rwx-- [ anon ]
00007f3268000000 0 65516 65516 rwx-- [ anon ]
00007f3324000000 0 65516 65516 rwx-- [ anon ]
00007f32c0000000 0 65520 65520 rwx-- [ anon ]
00007f3314000000 0 65528 65528 rwx-- [ anon ]
00000000401cf000 0 241904 240980 rwx-- [ anon ] <- Direct memory ?
000000077ae00000 0 2139688 2139048 rwx-- [ anon ] <- Heap ?
그렇다면 64MB 청크가 무엇인지 알아내는 방법은 무엇입니까? 무엇을 사용하고 있습니까? 어떤 종류의 데이터가 있습니까?
감사