2009-03-10 25 views
11

Chạy vào một vấn đề mà JSF đang lấp đầy các phiên của chúng tôi. Chúng tôi đã có một sự cố hệ thống vào ngày khác. Gửi Heap cho IBM để xem xét và thấy rằng chúng tôi đã có một số phiên lớn đến 50M. Họ tìm thấy các thành phần JSF trong phiên và một số rất lớn.Điều chỉnh JSF

Vì vậy, có bất kỳ điều chỉnh nào có thể thực hiện được không? Các mục cấu hình để xem xét? Hoặc hướng khác.

Hệ thống của chúng tôi được xây dựng bằng cách sử dụng JSF và Spring cho lớp trình bày, phần cuối là EJB, Spring và Hibernate tất cả chạy trên WebSphere 6.1.

Trả lời

22

JSF là một công nghệ hữu ích, nhưng bạn chắc chắn có thể tự treo mình với nó. Có vẻ như, bạn đang tăng kích thước của trạng thái xem (bằng cách đặt giá trị lớn trên các thành phần) hoặc bạn đang rò rỉ tham chiếu đến các thành phần vào trạng thái phiên khác (điều này sẽ là xấu). Một thủ phạm tiềm năng khác sẽ là một cái nhìn quá lớn (tôi đã thấy sự dễ dàng mà mọi người có thể xây dựng cây UI dẫn đến đồ thị điều khiển rất lớn với các bảng dữ liệu ở khắp mọi nơi). Tôi biết rằng IBM cung cấp các điều khiển văn bản và bảng tính phong phú - Tôi không thể nhận xét về ảnh hưởng của việc sử dụng những thứ này lên kích thước của tiểu bang.

Quả treo thấp là kiểm tra các hạt được quản lý được định cấu hình cho phạm vi phiên trong faces-config.xml.

JSF tiết kiệm hai điều giữa các yêu cầu:

  • quan điểm (tất cả các điều khiển trên trang)
  • bang view (trạng thái các nút điều khiển)

Những được tách ra vì một số điều khiển, chẳng hạn như con của bảng dữ liệu, có thể có nhiều trạng thái (một cho mỗi hàng). Nhà nước có thể được lưu vào một trường ẩn trên biểu mẫu (trong đó, nếu không được mã hóa, có thể là một mối nguy hiểm bảo mật lớn) hoặc trong phiên. Để chứa nhiều cửa sổ trình duyệt chia sẻ cùng một phiên (và, trong một số triển khai, hỗ trợ nút quay lại), nhiều chế độ xem được lưu trữ.

  • Sẽ có tùy chọn cấu hình để đặt số lượt xem mà ứng dụng sẽ giữ trong phiên cho một người dùng cụ thể tại bất kỳ thời điểm đã định nào.
  • Bạn có thể đo kích thước của trạng thái xem bằng cách cung cấp StateManager đo kích thước của chế độ xem/trạng thái đã lưu (định cấu hình Trình quản lý trạng thái trong cấu hình khuôn mặt.xml với một hàm tạo công khai có một Trình quản lý trạng thái - xem JSF spec các tệp PDF để biết thêm chi tiết; nhà nước là serializable và bạn có thể kiểm tra kích thước của nó bằng cách bán nó vào một dòng).

Hầu hết các ứng dụng JSF do IDE tạo đều có hạt sao lưu. Nó sẽ có thể, thông qua phạm vi đậu phiên để giữ trạng thái lâu hơn bạn muốn, đặt một căng thẳng trên phiên. Vì có xu hướng là một bean sao lưu cho mỗi trang, bạn càng có nhiều trang, vấn đề càng lớn. Kiểm tra faces-config.xml của bạn để xem đây có phải là một vấn đề tiềm ẩn không.

Một điều khác bạn có thể làm là định cấu hình HttpSessionAttributeListener trong web.xml. Bạn có thể nhận được stack trace để giúp xác định các khu vực có vấn đề trong ứng dụng của mình.

3

Đây là hệ thống thứ hai mà tôi đã nghe nói về điều đó đã chết vì JSF và tạo đối tượng quá mức. Người còn lại cũng sử dụng Spring và Hibernate ở phần cuối. Cấu hình với OptimizeIt cho thấy rằng phản hồi phụ trợ là theo thứ tự mili giây cho tất cả các yêu cầu, nhưng bạn có thể thời gian trình duyệt hiển thị lại với đồng hồ bấm giờ vì mất quá nhiều thời gian - 30 giây đến vài phút. Bộ nhớ được khách hàng tiêu thụ là vô lý.

Tôi chỉ là người quan sát chứ không phải là thành viên của nhóm dự án đó. Tôi sẽ phải hỏi xem vấn đề đã được sửa chưa, và nếu có, thì giải pháp có thể là gì.

Nhưng nếu hai điểm tạo ra một xu hướng, tôi muốn nói rằng JSF có thể không hoàn thiện. Cá nhân, tôi tránh xa nó hoàn toàn.

Tại sao không thử kết thúc giao diện web mùa xuân và xem điều đó có hữu ích không? Nếu bạn làm theo thành ngữ Spring, nó sẽ là một vấn đề khá đơn giản khi thay thế JSF bằng JSPL dựa trên JSP và các bộ điều khiển Spring.

+0

chỉ là ý kiến ​​cá nhân, nhưng tôi nghĩ lỗ hổng này nằm ở IBM và cũng là việc triển khai JSF của họ. Tôi không thể biện minh cho cảm giác của mình :) – guyumu

+0

Cái mà tôi thấy không sử dụng Sun JVM và triển khai Apache JSF. Apache là rất nhiều IBM, vì vậy tôi không thể nói làm thế nào hai là khác nhau. Tôi nghĩ đó là mô hình JSF - nó có vẻ rất nặng nề với tôi. – duffymo

3

Tôi đã làm việc trên một dự án JSF và thấy rằng chúng tôi đã có một lỗi mà chúng tôi đã thêm nhiều phần tử JSF h: form. Kết quả trong một bản sao của toàn bộ ViewState được bao gồm với mọi hình thức. Cắt xuống 1 trang trên mỗi trang sẽ cắt các trang từ ~ 2M xuống còn ~ 300K.

1

Bạn có thể gặp sự cố với nhiều bean sao lưu làm phạm vi phiên.

Bạn có thể thử xem xét MyFaces Orchestra. Đây là một thư viện cung cấp một phạm vi hội thoại, vì vậy khi người dùng đã kết thúc với một nhóm đậu cụ thể, họ sẽ bị loại bỏ khỏi phiên.

Tôi hiểu rằng Spring WebFlow có các tính năng tương tự nhưng tôi chưa thực sự xem xét nó!

1

JSF lưu trữ các khung nhìn trong phiên để hỗ trợ kiến ​​trúc dựa trên thành phần phong phú của nó (cần duy trì trạng thái xem) và có thể lấp đầy đống nếu không được sử dụng đúng cách. Nếu bạn không có luồng công việc lớn, luôn luôn có ít lượt xem mỗi phiên. Cũng tránh giữ sao lưu trong phiên càng nhiều càng tốt. Sử dụng thẻ tùy chỉnh để chỉ tạo đối tượng dữ liệu cho chu kỳ yêu cầu tiếp theo. Chúng ta cũng có thể sử dụng Spring Web Flow với JSF, giới thiệu phạm vi xem và phạm vi lưu lượng nếu chúng ta có luồng công việc dài trong ứng dụng để giảm không có lượt xem được định cấu hình trong phiên. JSF có thể được sử dụng để làm cho giao diện người dùng phong phú dễ dàng, giúp xây dựng ứng dụng web tương tự như ứng dụng máy tính để bàn. Phân bổ một đống đặc biệt cho khung công tác JSF để thực hiện công việc của mình. Nhưng sử dụng bộ nhớ hiệu quả ở phía ứng dụng và đảm bảo rằng không có rò rỉ bộ nhớ. Tất cả các rò rỉ bộ nhớ cần được điều tra và sửa chữa trong quá trình phát triển. Aways sử dụng một hồ sơ để tìm rò rỉ bộ nhớ và tắc nghẽn hiệu suất tồn tại trong ứng dụng.

Mat.

1

Nếu bạn đang sử dụng MyFaces < 1.1.6 có một rò rỉ bộ nhớ lớn theo cách lưu trữ các lượt xem cũ được sắp xếp trong phiên một cách hiệu quả không bao giờ cho phép chúng phát hành sao cho chúng có thể được thu gom rác. Tôi đã có một vấn đề nghiêm trọng với điều đó và đã có 50Mb phiên là tốt. Việc nâng cấp nhanh MyFaces đã khắc phục sự cố mà không gặp bất kỳ sự cố nào.

1

Định cấu hình kiên trì phiên cho cơ sở dữ liệu và sẽ sử dụng thuật toán ít được sử dụng nhất để đẩy các phiên sử dụng ít nhất ra khỏi bộ nhớ. Nó có hiệu suất cao (khi được cấu hình đúng cách) và sẽ giúp bạn cụ thể và nhanh chóng.

1

Bit của một chủ đề cũ, nhưng đã xem xét vấn đề này gần đây. Thông thường, Chế độ xem và Chế độ xem được lưu trữ (như đã đề cập trước đó) và lấp đầy phiên để cho phép nút quay lại hoạt động. Có các tham số để sắp xếp điều này trong các bộ mô tả triển khai của bạn (web.xml) cần được thiết lập.

Nhiều phiên bản của một số thư viện nhất định có thể cần nhiều cài đặt thông số, chẳng hạn như khi sử dụng MyFaces và JSF RI. Theo mặc định, chúng có thể được đặt thành một số giá trị khá cao (tương ứng là 20 và 16). Điều này có nghĩa rằng bạn có thể sử dụng 20 lần không gian bạn nên cho (phần của?) Phiên.

1

lời khuyên JSF chỉnh cho môi trường sản xuất:
- Việc sử dụng hình ảnh, CSS, và các nguồn lực JavaScript nên được thực hiện theo các thẻ HTML chuẩn (img,link,script) không server-side, và hãy chắc chắn để thiết lập #{request.contextPath} trước url để tránh đường dẫn tương đối vấn đề.
- Cache phần tĩnh của trang (menu,header,footer) sử dụng omnifaces cache
- Đặt refresh-period biến đến -1
- thiết project-stage để sản xuất
- Rà soát các bộ lọc mã của bạn nếu có

Ngoài ra, Kiểm tra bài viết của tôi "Java Server Faces in Real-Life Applications" trên DZone, nó sẽ cung cấp cho bạn bức tranh đầy đủ về JSF trong môi trường phát triển, thử nghiệm và sản xuất.

+0

Cảm ơn Shaz! , đã cập nhật. –