Java

Hiểu thế nào về OutOfMemoryError Exception trong Java

Q: JVM GC hoạt động hiệu quả có tiếng! Tại sao vẫn gặp OutOfMemoryError. Hết bộ nhớ có nghĩa là sao?

A: JVM GC sẽ tự động dọn dẹp bọn nhớ cho chương trình do vậy chương trình không phải làm gì. Tuy vậy khi GC cảm thấy không hoạt động theo mục tiêu đề ra, GC sẽ tự động lăn ra chết với OutOfMemoryError Exception.

GC sẽ OutOfMemoryError khi Quá nhiều thời gian dành cho GC. Nếu 98% thời gian GC dành cho việc thu hồi bộ nhớ mà bộ nhớ thu hồi được chỉ chiếm 2% heap.

--
Q: Tại sao JVM GC phải làm thế?
A: Lý do: GC làm như vậy để tránh vấn đề ứng dụng chạy trong điều kiện tỉ lệ bộ nhớ heap sử dụng được quá thấp, dẫn đến việc ứng dụng hầu như không tiến triển được.

--
Q: Cách giải quyết là gì?
A: Cách giải quyết: Tăng bộ nhớ heap bằng lựa chọn Xmx<N>.

--
Q: Tại sao tăng bộ nhớ heap giải quyết được vấn đề? Không phải tăng bộ nhớ heap sẽ làm tăng tỉ lệ bộ nhớ thu hồi được giảm đi? (< 2%)
A: Trả lời bằng post khác! Giải thích chung chung là: khi có thêm bộ nhớ, GC sẽ sắp xếp lại kích thước các thế hệ (generations) của các objects, nên việc GC sẽ hiệu quả hơn.

--
Q: Tham khảo thêm ở đâu:
A: Các nguồn sau:

  1. http://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html
  2. Một vài ghi chép về Java Hotspot VM Garbage Collector (JVM GC)
Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration