Trong mã của tôi, thường chạy trên máy chủ, tôi không kiểm soát cấu hình, tôi có bộ sưu tập người dùng và mỗi người dùng có một mảng byte[]
.tạo bộ nhớ cache của mảng byte
Đôi khi các mảng byte[]
này là duy nhất cho người dùng. Thông thường, mặc dù, sẽ có số lượng người dùng lớn với cùng một mảng byte[]
.
Tôi đang cố giảm mức tiêu thụ RAM của máy chủ.
Tôi đã thử biến các mảng byte[]
thành chuỗi và thực hiện chúng, nhưng sau đó tôi thường gặp phải lỗi ngoài bộ nhớ PERM-GEN. Tôi cũng thấy một sự suy giảm hiệu suất đáng kể với mã hóa/giải mã khi tôi muốn truy cập mảng byte[]
cho người dùng và tôi thấy việc sử dụng bộ nhớ có mức độ tệ hơn nhiều - các chuỗi presuambly lớn hơn nhiều so với mảng.
Làm cách nào tôi có thể tra cứu Set<SoftReference<byte[]>>
khi mảng Java không được băm và SoftReferences không bao hàm giá trị băm của đối tượng tại một trong hai điểm. Một Map<byte[],SoftReference<byte[]>>
rõ ràng là cũng đánh bại chính nó bởi vì chính là chính nó và ngăn cản việc thu thập; và Set
được triển khai nội bộ theo số Map
.
Vậy làm cách nào tôi có thể thực tậpbyte[]
mảng?
Một điều bạn nghĩ đến là mô hình Flyweight. Ngoài ra, hãy xem http://stackoverflow.com/questions/1058149/using-a-byte-array-as-hashmap-key-java –
Tôi nghĩ bạn sẽ phải bao bọc các mảng byte của mình, đánh đấm chúng hiệu quả, ví dụ: với 'ByteArray mới (byte [] theBytes)' và không bao giờ thực hiện các tham chiếu dài hạn bổ sung cho 'theBytes' bên ngoài chính' ByteArray'. Sau đó, các tham chiếu mềm tới 'ByteArray' sẽ hoạt động chính xác. Bạn cũng có thể xem 'WeakHashMap 'cho ứng dụng của bạn. –
Gene
Các mảng byte này lớn đến mức nào? Làm thế nào để người dùng có được một? – fge