Avatar
0
e2al3qakmdd1okym Beginner
Byte array fragment
Em đang có 1 byte array (Store) dùng để lưu Object đã được serialized, và 1 HashTable để lưu position cho object trong Store, giả sử khi xóa Object đi thì Store sẽ bị phân mảnh, em xin hỏi giải pháp cho trường hợp này. byte_mem.png

Một vài cách em hiện đang suy nghĩ:

  • Dùng 1 byte để đánh dấu vùng nhớ đó đã bị xóa, thêm position vào 1 HashSet (Tracker). Khi thêm mới 1 Object sẽ kiểm tra Tracker và tìm vị trí có space đủ để ghi vào, tuy nhiên độ dài Object có thể ít hơn nên space của vùng nhớ đó nên vẫn bị trống 1 phần
  • Dịch tất cả các Object phía sau lên tương tự như ArrayList, tuy nhiên em lại không biết cách set lại position cho HashTable
  • Answer
Remain: 5
2 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Các quản lý bộ nhớ hay ổ cứng thông thường của hệ điều hành hay các máy ảo là nó sẽ, tạo ra 1 bằng để lưu giữ thông tin các vùng nhớ, ví dụ:

0-4: trống

4-5: dùng

5-9: trống

Thì khi cần cấp phát nó sẽ tìm đến các vùng nhớ có đủ chỗ trống rồi cấp cho biến để ghi dữ liệu em ạ, em thử tham khảo các này xem sao nhé.

Chi tiết hơn để anh code rồi trả lời em sau nhé.

  • 1
  • Reply
Theo em hiểu cách của anh sẽ na ná hơi giống cách 1 của em anh nhỉ dùng 1 bảng để lưu các vùng bị trống  –  e2al3qakmdd1okym 1715009610000
Đúng là giống em ạ, em có cần anh code demo không hay em có thể tự code được? Anh bận quá chưa sắp xếp được thời gian  –  tvd12 1715079208000
Avatar
monkey Beginner
monkey Beginner
Cũng có 1 cách nữa là sử dụng danh sách liên kết em ạ:
package com.tvd12.example.common;

public class MemoryManagement {

    public static class Space {
        public int startIndex;
        public int position;
        public byte[] bytes;
        public int size;
        public Space prev;
        public Space next;

        public Space(int size) {
            this.bytes = new byte[size];
            this.size = size;
        }

        public Space(int startIndex, int position, byte[] bytes) {
            this.startIndex = startIndex;
            this.position = position;
            this.bytes = bytes;
        }

        public boolean enoughSize(int requiredSize) {
            return position + requiredSize <= size;
        }

        public Space splitIfNeed(int requiredSize) {
            Space newSpace = this;
            if (startIndex != position) {
                newSpace = new Space(
                    position,
                    position + requiredSize,
                    bytes
                );
                newSpace.prev = this;
                newSpace.next = next;
                this.next = newSpace;
                this.next.prev = newSpace;
                this.size = position;
            } else {
                newSpace.position = requiredSize;
            }
            return newSpace;
        }

        public void free() {
            if (this.next == null) {
                if (this.prev != null) {
                    this.prev.next = null;
                }
            } else {
                if (this.prev != null) {
                    this.prev.next = this.next;
                    this.next.prev = this.prev;
                }
            }
        }
        
        public int countSpaces() {
            int count = 1;
            Space space = this;
            while ((space = space.next) != null) {
                ++count;
            }
            return count;
        }
    }

    public static class Memory {

        public int maxSize;
        public Space root = new Space(1024);

        public Space allocate(int size) {
            Space availableSpace;
            Space node = root;
            while (true) {
                if (node.enoughSize(size)) {
                    availableSpace = node.splitIfNeed(size);
                    break;
                }
                if (node.next == null) {
                    availableSpace = new Space(size);
                    availableSpace.position = size;
                    availableSpace.prev = node;
                    node.next = availableSpace;
                    break;
                }
                node = node.next;
            }
            if (availableSpace == null) {
                throw new OutOfMemoryError("not enough");
            }
            return availableSpace;
        }

        public void retrieve(Space freeSpace) {
            freeSpace.free();
        }
    }

    public static void main(String[] args) {
        Memory memory = new Memory();
        Space space1 = memory.allocate(100);
        System.out.println(memory.root.countSpaces());
        Space space2 = memory.allocate(1024);
        System.out.println(memory.root.countSpaces());
        Space space3 = memory.allocate(1024);
        System.out.println(memory.root.countSpaces());
        memory.retrieve(space3);
        System.out.println(memory.root.countSpaces());
        memory.retrieve(space1);
        System.out.println(memory.root.countSpaces());
        memory.retrieve(space2);
        System.out.println(memory.root.countSpaces());
    }
}
  • 0
  • Reply