Reference Data Type and Garbage Collector
I. Memory Leak:
Memory Leak là một hiện tượng khi bộ nhớ được sử dụng bởi chương trình không giải phóng sau khi không còn được sử dụng nữa.
II. Grabage Collector:
Garbage Collector là một phần của máy ảo Java (JVM) và được sử dụng để thu dọn bộ nhớ tự động
Garbage Collector sẽ kiểm tra và quản lý bộ nhớ được cấp phát động trong chương trình Java, xoá các đối tượng không còn được sử dụng và giải phóng bộ nhớ của chúng.
Hoạt động:
- Duyệt bộ nhớ: Garbage Collector sẽ duyệt qua tất cả các đối tượng được cấp phát trong bộ nhớ và xác định xem đối tượng nào không còn được sử dụng.
- Xoá các đối tượng không còn được sử dụng: Sau khi xác định các đối tượng đã không còn được sử dụng, Garbage Collector sẽ xoá chúng khỏi bộ nhớ.
- Giải phóng bộ nhớ: Sau khi xoá các đối tượng không còn được sử dụng, Garbage Collector sẽ giải phóng bộ nhớ được cấp phát cho các đối tượng đó, và chuyển nó trở lại vào bộ nhớ sẵn sàng cho việc cấp phát các đối tượng mới.
III. Reference Data Type:
- Strong Reference (tham chiếu mạnh): Strong reference là một tham chiếu trực tiếp đến một đối tượng, Bất kỳ đối tượng nào đang được giữ Strong Reference thì GC sẽ không thể giải phóng được đối tượng đó. Đối tượng chỉ có thể được giải phóng khi được gán giá trị null
1 2 | <span class="token class-name">MyClass</span> obj <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyClass</span> <span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Weak Reference (tham chiếu yếu): Weak reference được sử dụng để theo dõi các đối tượng mà chúng ta không muốn giữ lại trong bộ nhớ khi chúng không được tham chiếu bởi bất kỳ strong reference nào. Weak reference có thể được sử dụng để giúp cho việc tạo ra cache hoặc bộ nhớ đệm với các đối tượng, mà không cần gây ra lỗi out of memory khi số lượng đối tượng tăng quá nhiều.
1 2 3 4 5 6 7 8 9 10 11 | <span class="token comment">// Khởi tạo đối tượng và tạo một weak reference.</span> <span class="token class-name">WeakReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Person</span><span class="token punctuation">></span></span> weakRef <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WeakReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">"John"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Lấy đối tượng từ weak reference.</span> <span class="token class-name">Person</span> person <span class="token operator">=</span> weakRef<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Kiểm tra xem đối tượng đã bị loại bỏ hay chưa.</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>person <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Person has been Garbage Collected"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
- Soft Reference (tham chiếu mềm): Weak Reference nhưng điểm khác ở chỗ nếu weak reference sẽ được giải phóng bộ nhớ ngay nhưng đối với Soft Reference thì phải đến khi bộ nhớ thấp. Khi JVM văng ra out of memory thì tham chiếu mềm đó mới được giải phóng.
1 2 3 4 5 6 7 8 9 | <span class="token comment">// Khởi tạo đối tượng và tạo một soft reference.</span> <span class="token class-name">SoftReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Person</span><span class="token punctuation">></span></span> softRef <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SoftReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">"John"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Lấy đối tượng từ soft reference.</span> <span class="token class-name">Person</span> person <span class="token operator">=</span> softRef<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Sử dụng đối tượng.</span> person<span class="token punctuation">.</span><span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Phantom Reference (tạm dịch là tham chiếu ma): Phantom reference cũng được sử dụng để theo dõi các đối tượng nhưng không giữ lại được bất kỳ đối tượng nào. Phantom reference được sử dụng để theo dõi việc thu hồi một đối tượng và thực hiện một số hoạt động ngay trước hoặc sau khi đối tượng đó bị Garbage Collector thu hồi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">// Tạo một đối tượng và một phantom reference.</span> <span class="token class-name">Person</span> person <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token string">"John"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">ReferenceQueue</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Person</span><span class="token punctuation">></span></span> queue <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReferenceQueue</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">PhantomReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Person</span><span class="token punctuation">></span></span> phantomRef <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PhantomReference</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span>person<span class="token punctuation">,</span> queue<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// kiểm tra đối tượng đã bị loại bỏ hay chưa.</span> <span class="token keyword">boolean</span> isRemoved <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">!</span>isRemoved<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">gc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">Reference</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span><span class="token punctuation">></span></span> ref <span class="token operator">=</span> queue<span class="token punctuation">.</span><span class="token function">poll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ref <span class="token operator">==</span> phantomRef<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Object has been Garbage Collected"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> isRemoved <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Tài liệu tham khảo:
https://github.com/hoangtien2k3qx1/Java/tree/main/src/java/DataType