2012-04-19 18 views
8

Chúng tôi đang chạy một cổng thông tin liferay trên tomcat 6. Mỗi portlet là một ứng dụng web chứa để nó bao gồm tất cả các thư viện mà chính portlet yêu cầu. Chúng tôi hiện có 30 + portlet. Kết quả của điều này là permgen của tomcat của chúng tôi tăng lên với mỗi portlet mà chúng tôi triển khai.Kích thước lớn Permgen + hiệu suất tác động

Hiện tại, chúng tôi có hai đường dẫn mà chúng tôi có thể theo dõi. Hoặc di chuyển một số thư viện được commenly được sử dụng bởi mỗi portlet của chúng tôi vào thư viện chia sẻ tomcat. Điều này sẽ bao gồm các công cụ như spring/hibernate/cxf/.... để giảm kích thước permgen của chúng tôi Hoặc dễ dàng hơn là tăng kích thước permgen.

Tùy chọn thứ hai này sẽ cho phép chúng tôi giữ mọi portlet như một thực thể tự liên kết.

Câu hỏi đặt ra là, có bất kỳ tác động tiêu cực nào về hiệu suất từ ​​việc tăng kích thước permgen không? Chúng tôi hiện đang chạy ở 512MB. Tôi đã tìm thấy rất ít hoặc không có thông tin về điều này. Nhưng tìm thấy một số bài đã được mọi người đang nói về chạy trên kích thước 1024MB permgen mà không có vấn đề.

+0

Tôi không mong đợi một giấy phép 1 GB gây ra sự cố. –

+1

Câu hỏi liên quan: http://stackoverflow.com/q/9636328/1140748 –

+0

Điều này không trả lời câu hỏi của bạn, nhưng thêm một khía cạnh khác: Tôi xem xét quyết định có 1 portlet cho mỗi plugin một giới hạn nhân tạo. Với số lượng portlet bạn cung cấp, tôi đặt cược có một số liên quan nơi tôi muốn khuyên bạn nên xem xét việc đóng gói những cái liên quan với nhau. Điều này sẽ chăm sóc nỗi đau của bạn và IMHO tăng tổng quan về các plugin của bạn. –

Trả lời

3

Miễn là bạn có đủ bộ nhớ trên máy chủ của mình, tôi không thể tưởng tượng bất cứ điều gì có thể xảy ra sai. Nếu bạn không, tốt, Tomcat thậm chí sẽ không bắt đầu, có lẽ, bởi vì nó sẽ không thể phân bổ đủ bộ nhớ. Vì vậy, nếu nó khởi động, bạn tốt. Theo như kinh nghiệm của tôi đi, 1GB PermGen là hoàn hảo âm thanh.

Nhược điểm của một PermGen lớn là nó để lại cho bạn bộ nhớ hệ thống ít hơn, bạn có thể phân bổ cho heap (Xmx).

Mặt khác, tôi khuyên bạn nên xem xét lại các lợi ích của việc suy nghĩ của portlet là các thực thể độc lập. Ví dụ:

  • vấn đề khả năng tương tác: nếu tất cả các portlets được phép có khả năng sử dụng các phiên bản khác nhau của cùng một thư viện, có một số nguy cơ là họ sẽ không hợp tác với nhau và với các cổng thông tin riêng của mình như dự định
  • hiệu suất: Dấu chân PermGen chỉ là một việc, nhưng thêm các lọ ở đây và ở đó trong các portlet sẽ yêu cầu các bộ mô tả tệp bổ sung; Tôi không biết về Windows, nhưng điều này sẽ làm tổn hại hiệu suất của máy chủ Linux trong thời gian dài.
  • tự do thay đổi: nếu bạn đang sử dụng maven để xây dựng các portlet, chuyển từ lib/ext libs sang thư viện lib của portlet chỉ là vấn đề thay đổi phạm vi phụ thuộc (điều này có thể phiền phức hơn với libs cổng); theo như tôi nhớ, Liferay SDK cũng giúp bạn dễ dàng thực hiện chuyển đổi tương tự với kiến ​​để thực hiện chuyển đổi tương tự trong nháy mắt bằng cách thêm tác vụ bổ sung kiến ​​để giải quyết các phụ thuộc và xóa chúng khỏi số lib của portlet theo yêu cầu
+0

perm gen không phải là một phần của java heap, nó sẽ không có tác dụng trên Xmx –

+0

Nó sẽ không tự nó - nhưng nó sẽ để lại cho bạn bộ nhớ ít hơn để phân bổ cho Xmx, phải không? –

+0

vâng, bạn đúng Michal - không đọc 'ít bộ nhớ' hơn là 'bộ nhớ hệ thống ít hơn'. –

1

Bộ nhớ PermGen có thể là rác được thu thập bởi các bộ sưu tập đầy đủ, do đó tăng nó có thể làm tăng thời gian GC khi một bộ sưu tập đầy đủ diễn ra.

Những bộ sưu tập này không nên diễn ra quá thường xuyên, và thường sẽ mất ít hơn một giây để đầy đủ 1GB bộ nhớ permgen - Tôi chỉ lấy số này từ bộ nhớ (hơi mơ hồ) của tôi, vì vậy nếu bạn thực sự lo lắng về thời gian GC cho một số lần kiểm tra chính mình (sử dụng -verbose:gc và đọc nhật ký, chi tiết hơn here)

0

Kích thước Permen nằm ngoài OLD Gen - vì vậy xin đừng trộn lẫn. Đồng ý về điểm thứ 2 - chúng ta có thể tăng permsize nhiều như chúng ta có thể làm - vì bộ nhớ là khá rẻ nhưng điều này sẽ nâng cao một số câu hỏi về cách chúng tôi đang quản lý mã của chúng tôi. tại sao heck chúng ta cần nhiều perm-JTa tiêu thụ nhiều như vậy - bao nhiêu lớp chúng ta đang tải? Có bao nhiêu bộ mô tả tập tin mà ứng dụng đang mở (kiểm tra bằng lệnh lsof). Chúng ta nên cố gắng trả lời chúng.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). –

+0

Vì, tôi đoán, lời buộc tội trộn lẫn đã được chỉ ra vào câu trả lời của tôi, tôi đã viết lại cụm từ được đề cập một chút để làm cho nó rõ ràng hơn. Tôi chỉ đơn giản có nghĩa là việc tăng bộ nhớ hệ thống cho PermGen sẽ khiến bạn có ít "bánh" hơn để đưa cho Xmx. Đối với câu hỏi của bạn về sử dụng bộ nhớ, tốt, bạn hoàn toàn đúng trong sự nhầm lẫn của bạn, nhưng OP đang chạy liferay, và liferay tạo ClassLoaders riêng biệt cho mỗi portlet bạn triển khai trên nó. Điều này có thể có nghĩa là toàn bộ, ví dụ, mùa xuân được nạp nhiều lần và đây là cách PermGen dễ dàng đi qua mái nhà bằng Liferay. –