2012-02-12 43 views
9

Chỉ là một câu hỏi nhanh về cách sử dụng bộ nhớ của khung chơi. Tôi có một cá thể sản xuất, xuất hiện để sử dụng 680768 kB bộ nhớ. Hầu hết nó nằm trong trao đổi.Sử dụng bộ nhớ của Playframework

Máy chủ (ảo) có khoảng 750 MB, nhưng cũng chạy máy chủ MySQL và 12 máy chủ ảo Apache. Đôi khi trở nên tạm thời không có điều kiện (hoặc rất chậm) trong thời gian ngắn. Tôi đoán đó là vì sự trao đổi (nó không phải là CPU).

Khuôn khổ có cần nhiều bộ nhớ không? Tôi có thể giới hạn mức sử dụng bộ nhớ với tham số JVM -Xmx256m hoặc hơn thế, nhưng giá trị nào được đưa vào và lý do nó sử dụng quá nhiều bộ nhớ là gì?

Đây là mức sử dụng của Play! trước và sau khi bắt đầu:

Java: ~~~~~ Version: 1.6.0_26 Trang chủ: /usr/lib/jvm/java-6-sun-1.6.0.26/jre bộ nhớ tối đa: 194.641.920 miễn phí bộ nhớ: 11.813.896 Tổng bộ nhớ: 30.588.928 vi xử lý hiện có: 2

Sau khi khởi động lại: Java: ~~~~~ Version: 1.6.0_26 Trang chủ: /usr/lib/jvm/java-6-sun-1.6 .0.26/jre Bộ nhớ tối đa: 194641920 Miễn phí bộ nhớ: 9893688 Tổng bộ nhớ: 21946368 Bộ xử lý có sẵn: 2

+0

Rất khó để trả lời một câu hỏi như vậy. Nó phụ thuộc vào rất nhiều yếu tố (phức tạp, bộ nhớ đệm, vv) - Chơi! khuyến khích một thiết kế phi trạng thái, do đó việc sử dụng bộ nhớ có vẻ hơi cao (mặc dù không đáng ngạc nhiên đối với Java). Bạn đã cố gắng khởi động lại máy chủ và xem liệu dấu chân bộ nhớ có thấp hơn không? Ngoài ra, một bãi chứa bộ nhớ có thể cung cấp cho bạn một gợi ý về nơi bộ nhớ này được cấp phát. –

+0

bạn có thể gửi đầu ra bộ nhớ mà trạng thái phát cung cấp cho bạn (ở đầu trạng thái) hay không. Về phần mình, tôi đang chạy các ứng dụng chơi với -Xmx64Mo mà không gặp bất kỳ vấn đề gì. Nếu bạn cần thêm bộ nhớ, bạn có thể bị rò rỉ bộ nhớ trong mã số –

+0

Tôi sẽ thêm nó vào câu hỏi. Chỉ có 71 MB của 665 MB hiện tại là trong bộ nhớ hoạt động (trên cùng). Các 665 có vẻ như một con số đủ ổn định. Sau khi vặn lại Play! ứng dụng (và ít nhất một yêu cầu) bộ nhớ được báo cáo theo đầu là 524m. (đặt mức sử dụng bộ nhớ được báo cáo bởi Play! Trong câu hỏi) –

Trả lời

5

Nó phụ thuộc vào rất nhiều thứ nhưng có java cần một số bộ nhớ cho phân bổ tự nhiên, vùng lưu trữ và không gian bộ nhớ heap.

Trạng thái phát cho biết rằng heap của bạn chỉ tiêu thụ 30588928 byte nhưng khi khởi động java phân bổ 194641920 cho vùng heap. Bạn có thể thử bắt đầu với -Xmx64M để hạn chế phân bổ đống.

Sau đó, bạn có thể tiết kiệm khoảng 128 Mo RAM nhưng java cũng phân bổ bộ nhớ cho jvm, do đó, dấu chân của quá trình sẽ nhiều hơn 64 Mo, nó phụ thuộc vào nền tảng của bạn nhưng nó sẽ có ít nhất 200/250 Mo.

Hãy thử giới hạn vùng heap của bạn xuống 64Mo nhưng 750 Mo có thể không đủ để chạy jvm và mysql.

Hãy nhớ rằng bạn không được sử dụng trao đổi với java vì bộ nhớ được cấp phát trong một khối để bạn trao đổi trong/hoán đổi toàn bộ vùng.

+0

Xin lỗi vì phản ứng chậm, tôi đã không có cơ hội thiết lập kiểm tra thích hợp để xem xét sự khác biệt. Cách tốt nhất, hoặc thậm chí chỉ là cách để chạy Play! với -Xmx64M? –

+4

Trong tập tin application.conf của bạn, thêm một dòng "jvm.memory = -Xmx64M" –

+0

Tôi đã làm điều này, và điều này đã thấy một giọt.Trước khi thay đổi: bộ nhớ Max: 249.364.480 bộ nhớ miễn phí: 20.543.688 Tổng bộ nhớ: 59.219.968 vi xử lý hiện có: 2 trên cho: (Virt) 627m (Res) 185m Sau khi thay đổi: bộ nhớ tối đa: 64.880.640 miễn phí bộ nhớ: 2.793.576 Tổng bộ nhớ: 53.366.784 vi xử lý hiện có: 2 trên cho (bẩn) 470m (res) 199m Vì vậy, sẽ lấy -Xmx64M là giá trị đúng để đưa vào mà không ảnh hưởng khuôn khổ? Nó là một chút không rõ ràng với tôi chính xác những gì lý do là để làm điều đó một cách này hay cách khác (tôi biết tôi nên đọc!) –

6

Tôi giả sử rằng bộ nhớ 680768 kB mà bạn đang báo cáo là từ một công cụ OS như ps hoặc trình quản lý tác vụ. Tổng dung lượng bộ nhớ được JVM sử dụng không gây ra sự đóng băng tạm thời của ứng dụng. Nguyên nhân có thể gây ra tạm dừng là bộ thu gom JVM Garbage đang chạy một GC đầy đủ sẽ tạm dừng tất cả các luồng trong JVM mà GC đầy đủ đang chạy (trừ khi bạn có một cấu hình gc đồng thời).

Bạn nên chạy JVM chạy playframework với -verbosegc -XX: + PrintGCDetails để xem GC đang làm gì.

Câu hỏi của bạn "Khung chơi có cần nhiều bộ nhớ" không thể trả lời được vì lượng bộ nhớ được sử dụng sẽ tùy thuộc vào những gì ứng dụng của bạn đang thực hiện trên cơ sở yêu cầu trước. Ngoài ra, JVM sẽ cho phép heap chạy xuống và sau đó thực hiện một chu kỳ GC để dọn dẹp Heap. Một ứng dụng JVM được xử lý tốt sẽ hiển thị mẫu răng cưa trên biểu đồ GC.

Tôi không biết JVM nào bạn đang sử dụng nếu bạn đang sử dụng máy ảo điểm phát sóng đọc hướng dẫn điều chỉnh JVM. http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html Thông thường, bạn cần phải hiểu các khái niệm GC sau đây trước khi đọc hướng dẫn điều chỉnh JVM để hướng dẫn có ý nghĩa.

  • Mark và Sweep Garbage Collection
  • Mark, Sweep và Garbage Collection nhỏ gọn
  • Sao chép thu
  • về thế hệ Garbage Collection
  • Parallel Garbage Collection
  • đồng thời Garbage Collection

http://www.amazon.com/Garbage-Collection-Handbook-Management-Algorithms/dp/1420082795/ là chuyên nghiệp bably một cuốn sách hay về chủ đề này

Một vài công cụ miễn phí đi kèm với điểm phát sóng JVM mà bạn có thể sử dụng bao gồm jconsole và jvisualvm. jvisualvm có một plugin tốt đẹp được gọi là VisualGC mà là tuyệt vời tại học tập như thế nào hotspot vm quản lý bộ nhớ.

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