Tiêu thụ bộ nhớ JVM


9

Tôi đang cố gắng chạy tomcat trên hệ thống bộ nhớ thấp (150-256Mb). Mặc dù tôi khởi động JVM với -Xmx64m (dù sao cũng phải là mặc định), quá trình này ngay lập tức chiếm tới 200Mb +.

Tôi tự hỏi tại sao JVM cần rất nhiều bộ nhớ, hoặc nếu có một cách điều chỉnh này? Các JVM khác có tốt hơn mặt trời cho mức tiêu thụ bộ nhớ thấp - và chúng có hoạt động với tomcat không?

Câu trả lời:


5

Ngoài heap (được chỉ định bởi -Xms-Xmx), bạn cần bao gồm các vùng không heap. Bao gồm các

  • Perm Gen, có dung lượng 64mb trên hệ thống 32 bit và 96mb trên hệ thống 64 bit ban đầu
  • Bộ đệm mã, nằm trong khoảng từ 20 đến 40mb tùy thuộc vào JVM
  • Vùng đệm NIO (nơi DirectByteBufferđược rút ra từ), ban đầu là 64mb

Ngoài ra còn có không gian làm việc của chính JVM sẽ là vài chục mb.

Bạn cũng nên biết về kích thước tự động của Sun JVM khi sử dụng máy lớp máy chủ . Theo thời gian, định nghĩa của lớp máy chủ (bộ nhớ 2Gb, nhiều hơn một lõi) đã bị khấu hao và hiện tại hầu hết các máy đều có khả năng kích hoạt -servertối ưu hóa. Lời khuyên của tôi là luôn luôn chỉ định -Xms-Xmxcài đặt và vượt qua -servertrừ khi bạn có thể nghĩ ra một lý do chính đáng không quá.


Cũng coi chừng bộ nhớ ảo mà JVM chỉ dự trữ và chưa sử dụng.
Steve Schnepp

Đúng, hầu hết các phân đoạn này, như PermGen và Code Cache được phân bổ khi khởi động, nhưng hầu hết các hạt nhân sẽ tránh phân bổ các trang cho các phân đoạn đó cho đến khi cần.
Dave Cheney

1
Cảm ơn thông tin - Tôi nghĩ rằng điều này giải thích bộ nhớ đang đi đâu. Có cách nào để thay đổi những giá trị này? Thậm chí tốt hơn sẽ là một cách để xem có bao nhiêu phần được sử dụng - Tôi không biết liệu có bất kỳ công cụ theo dõi / gỡ lỗi Java nào cho phép bạn làm điều này không?
Draemon

1
Bạn có thể sử dụng pmap hoặc jmap để có ý tưởng về các phân khúc khác nhau đang sử dụng. Hầu hết các tùy chọn phổ biến (và mặc định của chúng) được liệt kê ở đây, java.sun.com/javase/technologists/hotspot/vmoptions.jsp . Chúng thay đổi thường xuyên và có sự khác biệt về HĐH (kích thước ngăn xếp thường) và vòm (HĐH 64 bit thường ngụ ý các khu vực JVM lớn hơn)
Dave Cheney

3

Với tùy chọn -Xmx, bạn giới hạn kích thước của heap mà JVM dự trữ ... Có các tài nguyên bổ sung mà JVM cần ...

"Cảm ơn bộ nhớ" * là một bài viết hay giải thích cách JVM sử dụng bộ nhớ ...

Ngoài ra, bạn có thể dùng thử JVM của IBM, nó sẽ hoạt động với Tomcat, không biết liệu một số triển khai JVM miễn phí có hoạt động không.

Tuy nhiên, tôi không nghĩ rằng một cỗ máy có bộ nhớ quá thấp sẽ làm tốt cho bạn. Java chỉ cần bộ nhớ.

* Vì người dùng mới không thể gửi siêu liên kết, bạn phải tự tìm kiếm bài viết đó ... đây là lần đầu tiên trên google để "cảm ơn vì bộ nhớ ibm".




0

Một kỹ thuật hữu ích mà tôi đã tìm thấy là sử dụng giám sát JMX để xem chính xác dung lượng bộ nhớ được sử dụng bởi không gian heap vs permgen.

Thiết lập JMX trong Tomcat như được mô tả ở đây http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Sau đó sử dụng JConsole (đi kèm với JDK 5 hoặc JDK 6) - thẻ bộ nhớ sẽ theo dõi mức tiêu thụ bộ nhớ theo thời gian.

Ngoài ra - hãy cẩn thận với khởi động lại mềm của webapps. Nếu bạn tải lại một ứng dụng web, không gian permgen sẽ không được thu gom rác và sẽ tích tụ theo thời gian. Bạn cần dừng hoàn toàn / bắt đầu Tomcat để lấy lại không gian permgen.


VisualVM cũng có thể được sử dụng thay vì JConsole và cung cấp nhiều chi tiết hơn nữa khi tìm kiếm các vấn đề về bộ nhớ trong JVM. Tôi đã phải sử dụng điều này nhiều lần để tìm ra vấn đề.
Jeremy Bouse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.