2011-11-16 13 views
5

Vì vậy, mỗi vài ngày, quá trình java của tôi trên Ubuntu bị giết tự động và tôi không thể hiểu tại sao.Điều gì đó tiếp tục giết chết quá trình Java của tôi trên Ubuntu, bất cứ ai cũng biết tại sao?

Hộp của tôi có 35,84 GB RAM, khi tôi khởi chạy quá trình Java, tôi chuyển thông số -Xmx28g, vì vậy nó nên sử dụng ít hơn RAM tối đa có sẵn.

Tôi chạy jstat như sau:

# jstat -gccause -t `pgrep java` 60000 

Một vài dòng cuối cùng của sản lượng từ jstat ngay lập tức trước khi quá trình bị giết là:

Time  S0  S1  E  O  P  YGC YGCT  FGC FGCT  GCT  LGCC     GCC 
14236.1 99.98 0.00 69.80 99.40 49.88 1011 232.305 11 171.041 403.347 unknown GCCause  No GC 
14296.2 93.02 0.00 65.79 99.43 49.88 1015 233.000 11 171.041 404.041 unknown GCCause  No GC 
14356.1 79.20 0.00 80.50 99.55 49.88 1019 233.945 11 171.041 404.986 unknown GCCause  No GC 
14416.2 0.00 99.98 24.32 99.64 49.88 1024 234.945 11 171.041 405.987 unknown GCCause  No GC 

này có vẻ là những gì đã đi xuống trong/var/log/syslog trong khoảng thời gian này: https://gist.github.com/1369135

Thực sự không có gì chạy trên máy chủ này ngoài ứng dụng java của tôi. Chuyện gì vậy?

chỉnh sửa: Tôi đang chạy phiên bản java 1.6.0_20, thông số đáng chú ý duy nhất tôi chuyển đến java khi khởi động là "-server -Xmx28g". Tôi không sử dụng máy chủ ứng dụng nhưng ứng dụng của tôi nhúng "khung web đơn giản".

+0

RAM vật lý tối đa không tương đương với quá trình có thể sử dụng. Eric Lippert có một bài đăng tuyệt vời về . Tôi biết bài viết là Windows/.NET centric, nhưng nó cũng rất đáng kinh ngạc. Chỉ cần ra khỏi tò mò, bạn có thể cố gắng để bắt một OutOfMemoryError và đăng nhập này để xác nhận/từ chối rằng đây là nguyên nhân? –

+1

Tôi đang đăng nhập stdout và stderr, mà tôi tin là nơi một OOM sẽ đi, và tôi không thấy bất cứ điều gì mà sẽ chỉ ra một ngoại lệ OOM ... Trong kinh nghiệm của tôi một kết quả OOM trong ứng dụng bỏ, không bị giết. Trong trường hợp này có vẻ như ứng dụng đã bị hệ điều hành giết. – sanity

Trả lời

5

(Lần thử thứ hai).

Giả sử vấn đề là kẻ giết người OOM, sau đó nó đã giết chết quá trình của bạn trong một nỗ lực tuyệt vọng để giữ cho hệ điều hành hoạt động trong một cuộc khủng hoảng thiếu bộ nhớ nghiêm trọng.

tôi sẽ kết luận rằng:

  • JVM của bạn được thực sự sử dụng nhiều hơn 28GB đáng kể; nghĩa là bạn đã sử dụng bộ nhớ không phải là bộ nhớ heap đáng kể và

  • Hệ điều hành không được định cấu hình với một lượng không gian hoán đổi thích hợp.

Tôi muốn thử thêm không gian hoán đổi, để hệ điều hành có thể hoán đổi các phần của ứng dụng của bạn trong trường hợp khẩn cấp.

Cách khác, giảm kích thước heap của JVM.


Lưu ý rằng "-Xmx ..." đặt kích thước heap tối đa, không phải số lượng bộ nhớ tối đa mà JVM của bạn có thể sử dụng. JVM đặt một số thứ bên ngoài heap, bao gồm những thứ như bộ nhớ cho các ngăn xếp luồng và các tệp ánh xạ bộ nhớ mà ứng dụng của bạn đang sử dụng.

+1

Syslog được liên kết nói như thế nào? Giao diện điều khiển nói rằng java đã bị giết, không phải là nó bỏ thuốc lá. Nếu nó đã hết bộ nhớ, nó thường sẽ ném một ngoại lệ OutOfMemory, mà nó không có. Tôi đang chạy với một đống lớn như vậy bởi vì tôi cần lưu trữ hàng triệu đối tượng mà mỗi đối tượng yêu cầu một vài kilobyte RAM. – sanity

+0

@sanity - đọc lại ... –

+0

Theo một số lời khuyên khác tôi đang giảm mức sử dụng bộ nhớ tối đa xuống 15GB – sanity

1

wow, bạn có thực sự có 28 GB đống không? Có thể bạn nên thử giảm nó, giữ nó ở mức không quá 50% RAM tôi nghĩ (vì vậy ~ 18 GB, hoặc thậm chí có thể là 15 GB). Thêm 171 Toàn bộ GC là rất nhiều! Ứng dụng này chạy trong bao lâu? 171 trong 2-3 ngày âm thanh rất lớn. btw các gist chỉ ra một OOM trước khi chấm dứt - tôi nghĩ rằng việc giảm đống sẽ sửa chữa nó (bạn có thể giới hạn JVM từ việc mở rộng không gian bản địa). Hãy thử điều chỉnh các thông số khác nhau, hãy thử kích thước ngăn xếp ví dụ (-Xss) nếu cần. Kiểm tra kích thước tối đa perm và các phần khác quá. Đó là một vấn đề bộ nhớ và nó có thể không nhất thiết phải là đống.

+0

oops misread, thực sự là 11 GC đầy đủ, nhưng đó vẫn là một số ít. chắc chắn nó là một OOM và bạn nên thử giảm kích thước heap. – aishwarya

+0

Xin lỗi, tôi không thấy vị trí của gist chỉ ra một OOM, tôi không thể thấy bất kỳ OOM nào trong stdout hoặc stderr cho quá trình: -/Tại sao điều quan trọng là toàn bộ heap chỉ sử dụng 50% RAM? Chắc chắn -Xmx chỉ định RAM tối đa mà Java sẽ sử dụng? – sanity

+0

.. cũng vậy, sẽ không giảm kích thước heap * tăng * khả năng của OOM? – sanity

2

Bạn đang sử dụng JVM nào? và máy chủ ứng dụng nào? Có thể bạn đang phân bổ quá nhiều bộ nhớ, và điều đó có thể có vấn đề - bộ thu gom rác có thể gặp khó khăn khi thực hiện công việc của nó.

Tôi không chắc chắn nếu đây là trường hợp của bạn, nhưng tôi thấy khá thú vị this bài viết giải thích cách bộ nhớ overcommits Linux.

+0

Cập nhật câu hỏi của tôi với thông tin bạn yêu cầu – sanity

6

Chào mừng bạn đến với kẻ giết người OOM, một tính năng 'linux' là lệnh cấm các ứng dụng bộ nhớ lớn ở khắp mọi nơi. Không có công thức đơn giản để giải quyết, chỉ cần google cho nó và bắt đầu đọc và vũ khí.

Trong khi tôi không thể đặt ngón tay tinh thần của tôi trên một lời giải thích ngắn gọn về các shenigans của kẻ giết oom, tôi nhớ lại rằng các tham số điều chỉnh quan trọng được gọi là 'swappiness'. Trên một trong những máy chủ lớn của chúng tôi, chúng ta có:

/etc/sysctl.conf:vm.swappiness=20

đọc http://www.gentooexperimental.org/~patrick/weblog/archives/2009-11.html.

+0

Bạn có thể tóm tắt lý do tại sao kẻ giết người OOM sẽ giết chết một ứng dụng bằng cách sử dụng chỉ 28GB trên một máy tính với 35GB RAM và về cơ bản không có quá trình khác chạy trên nó? – sanity

+0

xem thêm http://stackoverflow.com/questions/15237067/how-do-i-configure-oom-killer – yegor256

Các vấn đề liên quan