bộ nhớ
bộ nhớ
Chương trình chạy thì dữ liệu phải nằm ở đâu đó. Ba chặng, đi từ biết nó nằm ở đâu tới hiểu vì sao đôi khi nó không chịu biến mất.
9 cột mốc · 5 có bài trong app
Bắt đầu
1Dữ liệu nằm ở đâu
Nhìn ra được ba vùng, và biết cái gì nằm vùng nào.
- Ngăn xếp và heapcó bàiKhung hàm sinh ra rồi mất theo lời gọi; list và object thì nằm ở heap, sống lâu hơn thế.
- Biến giữ địa chỉcó bàiÔ biến không chứa danh sách — nó chứa đường đi tới danh sách. Cả chặng sau đứng trên câu này.
- Rác và dọn ráccó bàiÔ không còn ai trỏ tới thì không đường nào tới được nữa, và được thu hồi.
2Khi dữ liệu đi vào hàm
Đoán đúng lúc nào hàm sửa được thứ bên ngoài, lúc nào không.
- Truyền tham sốcó bàiThứ được sao chép là địa chỉ, không phải dữ liệu. Một câu giải thích được cả hai bước sau.
- Sửa tại chỗ và gán lạicó bàiappend đi theo mũi tên rồi sửa; dấu bằng thì vẽ lại mũi tên. Hai chuyện hoàn toàn khác nhau.
- Copy nông và copy sâutự tìm hiểuSao chép một tầng hay sao chép hết các tầng bên trong — chỗ rất hay sai thầm lặng.
3Khi bộ nhớ không đủ
Nhận ra ba kiểu hỏng có gốc từ bộ nhớ.
- Stack overflowtự tìm hiểuĐệ quy không có điểm dừng: khung chồng lên khung cho tới hết chỗ.
- Rò rỉ bộ nhớtự tìm hiểuVẫn còn một mũi tên trỏ tới thứ bạn tưởng đã bỏ, nên bộ dọn rác không dám đụng vào.
- Dữ liệu quá lớntự tìm hiểuĐọc cả file 2GB vào một biến, thay vì đọc từng phần một.
Đích
Lộ trình dừng ở đây
Ba chặng trên đủ để đọc hiểu phần lớn lỗi liên quan tới bộ nhớ. Phần dưới là hướng đi sâu hơn.
- Profiler bộ nhớCông cụ chỉ thẳng ra thứ gì đang chiếm chỗ và ai còn trỏ tới nó.
- WeakMap · weak referenceCách giữ một tham chiếu mà không ngăn bộ dọn rác làm việc.
- Dữ liệu bất biếnKhông sửa tại chỗ nữa — đổi lại là mất hẳn một lớp lỗi.
- Đọc theo luồngXử lý dữ liệu lớn từng khúc, thay vì nạp hết vào bộ nhớ.