JDK cung cấp khả năng cấp phát để phân bổ cái gọi là ByteBuffers trực tiếp, nơi bộ nhớ được cấp phát bên ngoài vùng heap Java. Điều này có thể có lợi vì bộ nhớ này không bị bộ thu gom rác chạm vào, và vì vậy không đóng góp cho GC overhead: đây là một đặc tính rất hữu ích cho những thứ tồn tại lâu dài như cache.Ví dụ về việc buộc giải phóng bộ nhớ gốc trực tiếp ByteBuffer đã cấp phát, sử dụng sun.misc.Unsafe?
Tuy nhiên, có một vấn đề nghiêm trọng với việc triển khai hiện tại: bộ nhớ cơ bản chỉ được phân bổ không đồng bộ khi ByteBuffer sở hữu được thu gom rác; không có cách nào để buộc tái phân bổ sớm. Điều này có thể có vấn đề vì bản thân chu trình GC không bị ảnh hưởng bởi việc xử lý ByteBuffers và cho rằng ByteBuffers có khả năng cư trú trong vùng bộ nhớ thế hệ cũ, có thể GC được gọi là giờ sau khi ByteBuffer không còn sử dụng nữa. Tuy nhiên, về mặt lý thuyết, có thể sử dụng phương thức sun.misc.Unsafe
(freeMemory, allocateMemory) trực tiếp: đây là những gì JDK sử dụng để phân bổ/deallocating bộ nhớ riêng. Nhìn vào mã, một mối quan tâm tiềm năng mà tôi thấy là khả năng giải phóng bộ nhớ đôi - vì vậy tôi muốn đảm bảo rằng trạng thái sẽ được làm sạch đúng cách.
Có ai có thể chỉ cho tôi mã để thực hiện việc này không? Lý tưởng nhất là muốn sử dụng nó thay vì JNA.
LƯU Ý: Tôi đã thấy this question là loại có liên quan.
Có vẻ như các câu trả lời được chỉ ra là cách tốt để đi: here là ví dụ về mã từ Tìm kiếm đàn hồi sử dụng ý tưởng. Cảm ơn mọi người!
Có thể, được tìm thấy trong trên SO năm trước ... tìm kiếm ngay bây giờ. (Trong quá khứ tôi đã kết thúc bằng cách sử dụng một hàng đợi hình tròn của bộ đệm, mà giữ áp suất thấp trong trường hợp của tôi.) –
Wow, tôi không thể tìm thấy bất kỳ bài viết tốt bất cứ nơi nào ngay bây giờ: ( –
Tôi chưa thấy một System.gc – nilskp