2009-09-25 11 views
23

Tôi đang cố gắng xác định vị trí bộ nhớ của tôi đã đi cho một quá trình java chạy trong linux. Có người đề nghị tôi sử dụng pmap -x để xem chính xác bộ nhớ đang làm gì.Đang cố gắng xác định vị trí rò rỉ! Anon có nghĩa là gì đối với pmap?

Đầu ra là rất dài nhưng cơ bản là một phần tốt đẹp của nó là một lặp lại điều này:

00007fbf75f6a000 1016  -  -  - rwx-- [ anon ] 
00007fbf76068000  12  -  -  - ----- [ anon ] 

chính xác điều này có ý nghĩa gì? Tại sao tôi có quá nhiều mục trong số này (4000+)?

Trả lời

28

Khối Anon là các khối "lớn" được phân bổ qua malloc hoặc mmap - xem manpages. Như vậy, chúng không liên quan gì đến vùng heap Java (ngoài thực tế là toàn bộ đống lưu trữ sẽ được lưu trữ trong một khối như vậy).

Theo kinh nghiệm của tôi, ngăn xếp chuỗi cũng sử dụng khối anon. Nếu bạn thấy nhiều khối anon mà tất cả đều có cùng kích thước và kích thước đó là 512k đến 4Mb (ví dụ dưới đây được lặp lại hàng chục lần cho một quá trình Tomcat mà tôi đang chạy), đó là nguyên nhân có thể xảy ra. Tùy thuộc vào chương trình, bạn có thể có đến vài chục trong số này; nếu bạn đang thấy hàng nghìn, điều đó có nghĩa là bạn có vấn đề với luồng.

b089f000 504K rwx-- [ anon ] 
b091d000  12K ----- [ anon ] 
b0920000 504K rwx-- [ anon ] 
b099e000  12K ----- [ anon ] 
b09a1000 504K rwx-- [ anon ] 
b0a1f000  12K ----- [ anon ] 

Nhưng điều đó để lại một câu hỏi: tại sao bạn đang sử dụng pmap để chẩn đoán một vấn đề bộ nhớ Java?

+0

> tại sao bạn sử dụng pmap để chẩn đoán sự cố bộ nhớ Java? Chúng tôi có một quá trình java với heap thiết lập để tối đa 256MB nhưng đó là bộ nhớ RSS là 8,9GB. Chúng ta có thể sử dụng công cụ nào khác để chẩn đoán điều này? – Opher

+1

@Opher - chắc chắn, hợp lý với bạn. Nhưng bạn có phải là OP? (và nếu có, tại sao bạn lại bình luận 8 năm sau?). Từ câu hỏi ban đầu, không rõ OP có biết anh ta/cô ấy đang tìm kiếm gì không. – kdgregory

+1

Và như một gợi ý: nếu bạn thấy sự chênh lệch giữa kích thước heap được cấu hình và RSS, hãy tìm các tệp ánh xạ bộ nhớ hoặc bộ đệm trực tiếp. Bạn sẽ thấy hành vi như vậy, ví dụ, từ một máy chủ Kafka hoặc SOLR, và nó là bình thường. – kdgregory

3

Xem this partthis part của hiệu suất hệ thống Điều chỉnh bộ nhớ ẩn danh.

+0

Điều đó cho bạn biết cách phân bổ ẩn danh được quản lý, chứ không phải như thế nào. Mặc dù liên kết tổng thể là khá tốt. – kdgregory

2

Sử dụng Eclipse MAT (khi bạn nhận được OutOfMemoryExceptions trong Java Heap không phải là vùng gốc).

0

Tôi đã thấy mẫu đó trước khi bị rò rỉ chỉ. Nếu bạn có mã đang cố gắng để tạo chủ đề, nhưng bằng cách nào đó làm rối tung và rò rỉ một chuỗi, bạn sẽ có được một mẫu như vậy trong pmap.

Tôi nghĩ rằng mỗi bit bộ nhớ là kích thước ngăn xếp tối thiểu cho chủ đề, chắc chắn nó không có gì để làm với đống trong trường hợp của chúng tôi.
Chúng tôi vẫn nhận được OutOfMemoryErrors khi chúng tôi đạt đến giới hạn OS, thậm chí tho khi chúng tôi phân tích cú pháp vùng heap nó không được phân bổ tổng thể.

Khi chúng tôi gặp sự cố như thế này pmap [pid] | grep -c 12K hóa ra là số lượng chủ đề đang sử dụng.