Tôi sẽ sử dụng bộ nhớ đệm dựa trên SoftReference (một điều khá đơn giản bởi chính nó). Tuy nhiên, tôi đã gặp một vấn đề khi viết một bài kiểm tra cho nó.Làm thế nào để làm cho hệ thống java phát hành Soft References?
Mục tiêu của thử nghiệm là kiểm tra xem bộ nhớ cache có yêu cầu đối tượng được lưu trong bộ nhớ cache trước đó từ máy chủ một lần nữa sau khi xóa bộ nhớ xảy ra.
Ở đây tôi tìm thấy vấn đề làm thế nào để làm cho hệ thống để phát hành các đối tượng mềm tham chiếu. Gọi System.gc() là không đủ vì các tham chiếu mềm sẽ không được giải phóng cho đến khi bộ nhớ yếu. Tôi đang chạy thử nghiệm đơn vị này trên máy tính để ngân sách bộ nhớ cho máy ảo có thể khá lớn.
================== Đã thêm sau ========================== ====
Cảm ơn tất cả những ai đã quan tâm để trả lời!
Sau khi xem xét tất cả các pro và của Contra tôi đã quyết định đi theo lực lượng cách vũ phu như tư vấn bởi Nanda và jarnbjo. Nó xuất hiện, tuy nhiên, JVM không phải là câm - nó thậm chí sẽ không cố gắng thu gom rác nếu bạn yêu cầu một khối mà một mình là lớn hơn ngân sách bộ nhớ của VM. Vì vậy, tôi đã sửa đổi mã như sau:
/* Force releasing SoftReferences */
try {
final List<long[]> memhog = new LinkedList<long[]>();
while(true) {
memhog.add(new long[102400]);
}
}
catch(final OutOfMemoryError e) {
/* At this point all SoftReferences have been released - GUARANTEED. */
}
/* continue the test here */
IMHO bạn đang sử dụng thiết lập thử nghiệm rất dễ vỡ (và không xác định?) Để kiểm tra chức năng tham chiếu mềm Java VM, thay vì thử nghiệm logic ứng dụng của riêng bạn. – Ruben
Có, tôi đồng ý. Đó là một trong những lợi thế của phương pháp này. Tuy nhiên, với cách tiếp cận này bạn làm chính xác những gì các thử nghiệm phải làm - kiểm tra hợp đồng của đơn vị. Nếu tôi lấy một cách khác, nó sẽ kiểm tra nội bộ của đơn vị - đó là không mong muốn vì nó vi phạm đóng gói, và giới thiệu sự phụ thuộc không cần thiết nữa. Nhưng bạn đúng - trong thử nghiệm của tôi nó phụ thuộc vào hành vi của VM trong trường hợp khủng hoảng bộ nhớ. Trong tiêu chuẩn java người ta nói rằng VM * sẽ * phát hành các tham chiếu mềm trước khi ném OutOfMemoryError - tốt, chúng ta hãy hy vọng rằng nó thực sự. – JBM
+1, điều này đã giúp tôi gỡ lỗi một vấn đề mà tôi nghĩ Swing đã bị rò rỉ bộ nhớ nhưng nó đã thực sự chỉ giữ tài liệu tham khảo mềm cho một số đối tượng ứng dụng. – casablanca