🥬
FreshForFresh
  • ✌️Xin chào!
  • Overview
    • 💡Data structures and Algorithms
    • 👀Programming
    • 🧠Database
    • 🦴Back-End
    • ✨Front-End
    • 💐Spring Framework
    • 🛠️Tool
  • Data structures and Algorithms
    • 🎰Data Type
    • 🗑️Garbage collection
    • 🧩Data structures
    • 🎲Algorithms
  • Programming
    • 🧮Compiler
      • 🤖Tại sao phải cần compiler?
      • 📠Java Virtual Machine
  • 📈Thread
  • 🔐Lock & Deadlock
  • 🏇Race condition & Data Race
  • 🧯Synchronized
  • 🗜️Blocking IO và Non Blocking IO Client Server Socket
  • 🌐Languages
    • 🎛️Programming Language
    • 📑Client-Side & Server-Side
    • ⁉️Why java? Why javascript?
  • 🗼Design pattern
    • 🎨Front-End Design Pattern
    • 🏗️Back End Design Pattern
      • 🐴with Java
      • 🦄with Spring Boot
      • 🐖with Modern Backend Development
      • 🐁with Microservice
  • 🍀Clean Code
    • 🌊Chương 1: Code sạch
    • 📐Chương 2: Quy tắc đặt tên rõ nghĩa
    • 🚧Chương 3: Cách viết hàm
    • 👻Chương 4: Comments thế nào cho chuẩn?
    • 🥳Chương 5: Định dạng code.
    • 😈Chương 6: Đối tượng và cấu trúc dữ liệu
    • 🐛Chương 7: Xử lí lỗi
    • ☦️Chương 8: Ranh giới code
    • 🧪Chương 9: Unit test
    • 🥂Chương 10: Lớp đối tượng
    • 🥡Chương 11: Code sạch cấp hệ thống
  • Database
    • 🐔Giới thiệu
    • 📰Các loại cơ sở dữ liệu
    • 🐘Các loại DBMS phổ biến
    • 🕵️‍♀️SQL và cách sử dụng với relational database
      • 👺Lệnh SQL
      • 🛢️JOIN trong SQL
      • 🛕GROUP BY trong SQL
      • 🐼ORDER BY trong SQL
      • 🐣Truy vấn con SUBQUERY trong SQL Server
      • 🏦Transaction Trong SQL
      • 🇲🇰ACID
    • ☢️Thiết kế cơ sở dữ liệu
    • 🕍Consistency and concurrency handling
      • 🔒Database locking
      • 🎮Concurrency Control
      • 🙀Isolation Level
    • 🎨Performance & Scability
      • ☝️Indexing
      • 👯‍♂️Partitioning
      • 💅Các tips tăng hiệu suất SQL
      • 🇲🇬Kiểm tra và Xác thực việc Sao lưu và Phục hồi CSDL
      • 🌠Database sharding
      • 🧘‍♂️REPLICATION
      • 😁Các vấn đề ảnh hưởng đến performance.
  • Back-End
    • 🔫API?
    • 🐕‍🦺Web Services
    • 💾Phân biệt API và web service
    • 🙆‍♂️Tìm hiểu về RestAPI
    • 🧦SOAP
    • ✈️GraphQL API
    • 📊Compared GraphQL & REST
    • 📄Phân biệt HTTP & HTTPS
    • 🚵Client & Server
    • 🇩🇲DOM
  • Front-End
    • 🦑User Interface (UI)
    • 🛰️State Management
  • Spring Framework
    • 🔐Spring Security
      • 🌅Đơn giản hoá Spring Security
      • 🌸Spring Security: Authentication and Authorization In-Depth
      • 🚻OAuth2 Basic
      • 🀄JWT + Spring Security Oauth
      • 📤Logout trong ứng dụng sử dụng bảo mật Oauth
      • 🔂Reset Password
      • 🎗️OAuth2 Remember Me với Refresh Token
      • ⛓️OAuth2 cho một Spring REST API
  • Network
    • 💸Mạng máy tính căn bản
  • Tool
    • 🦏Các câu lệnh Docker cơ bản
    • 🦧Github
      • 🐰Các lệnh Git cơ bản
      • 🐇Một số trường hợp khi sử dụng Git
    • 🏚️WebServer
      • 🪂Tổng quan về kiến trúc hệ thống
      • 🔃Cơ bản về WebServer Nginx
  • Tài nguyên
    • 👨‍🏫Course
    • 📖Docs
Powered by GitBook
On this page
  • Garbage Collection là gì?
  • Cơ chế hoạt động của Garbage Collection
  1. Data structures and Algorithms

Garbage collection

Quản lý bộ nhớ Heap trong JVM

Garbage Collection là gì?

Trong máy ảo Java (JVM), quá trình thu gom rác (garbage collection) là quá trình tự động xác định và loại bỏ các đối tượng không được tham chiếu (unreferenced objects) từ bộ nhớ Heap. Quá trình này giải phóng không gian không còn sử dụng và cấp phát lại cho các đối tượng mới.

Trái với ngôn ngữ như C, trong Java không cần thực hiện việc giải phóng bộ nhớ một cách thủ công. JVM tự động quản lý việc thu gom rác và giải phóng bộ nhớ không còn sử dụng. Khi một đối tượng không còn được tham chiếu từ bất kỳ vị trí nào trong chương trình, nó trở thành đối tượng không sử dụng và sẽ được thu gom rác trong quá trình tiếp theo của thu gom rác. Quá trình này giúp đảm bảo rằng bộ nhớ được sử dụng hiệu quả và giảm nguy cơ xảy ra lỗi tràn bộ nhớ (memory leaks).

Garbage collector là chương trình chạy nền, nó theo dõi toàn bộ các Object trong bộ nhớ (Heap) và tìm ra những Object nào không được dùng nữa (không có Object nảo reference đến nó). Toàn bộ những Object không có reference sẽ bị xóa.

Cơ chế hoạt động của Garbage Collection

What are Garbage Collection Roots in Java?

Garbage Collection hoạt động dựa trên khái niệm của Garbage Collection Roots (GC Roots) để xác định 1 Object còn sống hay đã chết.

Một số ví dụ về GC Roots:

  • Các class được load bởi System class loader (không phải custom class)

  • Live threads

  • Local variables and parameters of the currently executing methods

  • Local variables and parameters of JNI methods

  • Global JNI reference

  • Các Objects được sử dụng làm monitor cho synchronization

  • Các Object được JVM giữ lại từ GC cho mục đích của nó

GC duyệt qua toàn bộ biểu đồ Object trong bộ nhớ, bắt đầu từ GC Roots và theo references từ roots đến các Object khác.

Quá trình thu gom rác cơ bản thông qua 3 bước sau:

  1. Marking: Là bước đánh dấu những Object còn sử dụng và những Object không còn sử dụng.

  1. Normal deleting: Trình Garbage Collector sẽ xóa cá Object không còn sử dụng.

  1. Deletion with Compacting: Sau khi những Object không còn được sử dụng bị xóa, những Object còn được sử dụng sẽ được "gom" lại gần nhau. Điều đó làm tăng hiệu xuất sử dụng bộ nhớ trống để cấp phát cho những Object mới.

Để thực hiện việc tự động giải phóng các Object khi chúng không được sử dụng thì bộ nhớ Heap được chia thành các phần nhỏ như hình dưới đây.

Young Generation Là nơi chứa toàn bộ Object mới được khởi tạo. Khi vùng nhớ Young generation đầy thì garbage collectior là Minor GC hoạt động. Vùng Young generation lại được chia thành 3 vùng nhỏ hơn là Eden và 2 vùng Survivor là S0, S1.

Ban đầu mọi Object mới tạo được chứa ở vùng Eden, khi Eden đầy thì Minor GC chuyển chúng sang vùng S0, S1.

Minor GC liên tục theo dõi các Object ở S0, S1. Sau "nhiều" chu kỳ quét mà Object vẫn còn được sử dùng thì chúng mới được chuyển sang vùng nhớ Old generation. Old generation được quản lý bởi garbage collectior khác là Major GC.

Hình trên mô phòng 2 Object được chuyển từ vùng Young generation sang Old generation sau 9 chu kỳ quét của Minor GC. Những ô màu vàng tượng chưng cho những Object đã không còn được sử dụng (unreferenced). Chúng sẽ được xóa khi Minor GC hay Majo GC clear vùng nhớ nó quản lý.

Mô hình vùng nhớ Heap có vùng Perm (Permanent Generation), Perm không phải một phần của Heap. Perm không chứa Object, nó chứa metadata của JVM như các thư viện Java SE, mô tả các class và các method của ứng dụng.

PreviousData TypeNextData structures

Last updated 1 year ago

🗑️