2012-07-12 42 views
5

Rõ ràng là tại một số điểm một đối tượng được tạo ra và bị phá hủy/trả về hồ bơi. Tôi đặc biệt quan tâm đến cách chúng được thu gom rác. Có cách nào để kiểm soát hành vi này không? Cụ thể, sẽ gọi tới số invalidate() đánh dấu các đối tượng này để thu thập? Khi nào họ phát hành bất kỳ tài liệu tham khảo được lưu trữ trong đó?Vòng đời của đối tượng Java HttpSession là gì?

Chi tiết càng tốt.

Trả lời

8

HttpSession về cơ bản là bản đồ từ khóa chuỗi đến một số giá trị tùy ý. Mỗi khi bạn tạo phiên (bằng cách truy cập JSP hoặc gọi getSession()/getSession(true)), vùng chứa sẽ tạo ID phiên chuỗi duy nhất và giữ tham chiếu đến đối tượng HttpSession đó. Một lần nữa, nó sẽ sử dụng một bản đồ từ ID phiên tới đối tượng HttpSession.

Khi bạn đặt thứ gì đó trong phiên, vùng chứa giữ tham chiếu đến phiên đó và phiên giữ một tham chiếu đến đối tượng của bạn. Nó sẽ ở đó một thời gian. Có ba tình huống khi hàng của bạn sẽ được loại bỏ khỏi phiên:

  1. Khi bạn loại bỏ một cách rõ ràng (removeAttribute() hoặc setAttribute(null))

  2. Khi bạn invalidate() toàn bộ phiên. Điều này về cơ bản loại bỏ tất cả các thuộc tính và loại bỏ toàn bộ phiên từ bản đồ phiên được quản lý bởi container

  3. Khi phiên hết hạn (cùng hành vi với 2.) Điều này xảy ra khi không có phiên truy cập servlet/JSP trong khoảng thời gian có thể cấu hình được (ví dụ 10 phút)

Thời điểm một đối tượng được xóa khỏi phiên làm việc đó, nó đủ điều kiện thu gom rác và sẽ bị xóa trong lần chạy GC tiếp theo .


Bạn có thể thêm một đối tượng mà thực hiện HttpSessionBindingListener một HttpSession để quan sát một số các hành vi được mô tả ở trên. Ví dụ, một đối tượng thực hiện giao diện này có thể in một thông báo tường trình khi nó không được gắn kết từ phiên làm việc.

Bạn có thể xem documentation here.

1

Tôi nghĩ điều này phụ thuộc vào vùng chứa bạn sử dụng, câu hỏi về việc triển khai.

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