chúng tôi đang cố gắng điều tra việc sử dụng bộ nhớ của quá trình java dưới tải vừa phải.
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
Như bạn có thể thấy chúng tôi có bộ nhớ thường trú tại 6Gb. Bây giờ phần thú vị là đây: quá trình được thực hiện với các thông số này:
- -Xmx2048m
- -Xms2048m
- -XX: Kích thước mới = 512m
- -XX: MaxDirectMemorySize = 256m
- ... một số người khác cho GC và công cụ
Nhìn vào các cài đặt này và sử dụng bộ nhớ thực tế, chúng tôi tình cờ thấy được sự khác biệt của những gì chúng tôi mong đợi quá trình này sẽ được sử dụng và những gì nó thực sự sử dụng.
Thông thường các vấn đề về bộ nhớ của chúng ta được giải quyết bằng cách phân tích đống heap nhưng trong trường hợp này bộ nhớ của chúng ta được sử dụng ở đâu đó bên ngoài heap.
Câu hỏi: Điều gì sẽ là các bước để thử và tìm lý do của việc sử dụng bộ nhớ cao như vậy? Những công cụ nào có thể giúp chúng ta xác định những gì sử dụng bộ nhớ trong quá trình đó?
CHỈNH SỬA 0
Có vẻ như đây không phải là vấn đề liên quan đến đống vì chúng ta vẫn còn khá nhiều khoảng trống ở đó:
jmap -heap 12663
kết quả trong (chỉnh sửa để tiết kiệm không gian)
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
CHỈNH SỬA 1
sử dụng pmap chúng ta có thể thấy rằng có khá nhiều phân bổ 64Mb:
pmap -x 12663 | grep rwx | sort -n -k3 | less
kết quả trong:
... 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 ?
Vậy làm thế nào để tìm ra những khối 64Mb đó là gì? Sử dụng chúng là gì? Những loại dữ liệu trong họ?
Cảm ơn