Java don rác như thế nào

Trong Java, rác (garbag) có nghĩa là mộ đố đố ượng không được ham chếu đến nữa và bộ hu gom rác (Garbag collcor) có nhệm vụ hủy các đố ượng đó để gả phóng bộ nhớ.     

Garbag collcors là gì ?

Chắc hẳn các vlopr đã không í lần ừng bị "mmory lak" hay là "ou of mmory", nguyên nhân là o vệc quản lý bộ nhớ không ố. Rấ may rong Java đã cung cấp mộ bộ Garbag Collcor sẽ ự động ọn ẹp bộ nhớ. Nhờ nó, các vlopr sẽ không cần quan âm đến vệc quản lý và phân phố lạ bộ nhớ của chương rình như C/C++.

Garbag Collcors (ướ đây sẽ gọ ắ là GC) được định nghĩa như là mộ quá rình ự động hực h nhệm vụ quản lý bộ nhớ. Co Java được ịch sang byco rồ chạy rên máy ảo Java hay vế ắ là JVM. Trong quá rình chạy chương rình, các đố ượng được ạo ở vùng nhớ hap, mộ phần bộ nhớ ành cho chương rình. Sau cùng, sẽ có mộ và đố ượng mà chương rình không cần ùng đến. Các đố ượng này sẽ được garbag collcor ruy ìm và xóa bỏ để hu hồ lạ ung lượng bộ nhớ. Khác bệ rấ nhều kh chúng a làm vệc vớ C/C++, vệc quản lý bộ nhớ phả hực hện "by han".

Và nếu hểu được cách hức mà GC hoạ động như hế nào, các lập rình vên sẽ ễ àng hơn rong vệc phá rển phần mềm.

Vậy Garbag collcors hoạ động như hế nào?

Đầu ên chúng a hãy nhớ lạ kến rúc JVM, rong moul "Run m ara" chúng a có 2 vùng nhớ là vùng nhớ Sack (ùng để lưu rữ ham số và các bến local) và vùng nhớ Hap (ùng để lưu rữ các đố ượng sau kh khở ạo bằng ừ khóa nw và các bến sac). Bộ nhớ Hap là bộ nhớ cần ọn ẹp nhấ vì các Objc không cần ùng nữa phả được xóa bỏ để gả phóng bộ nhớ.

Có nhều ến rình hu gom rác khác nhau nhưng phổ bến nhấ Oracl HoSpo. Mặc ù HoSpo có nhều ến rình hu gom rác được ố ưu cho ừng rường hợp khác nhau nhưng ấ cả đều ho mộ phương hức cơ bản nhấ. Đầu ên, các Objc không được ham chếu sẽ được đánh ấu sẵn sàng để được ọn rác. Ở bước hứ ha, rình hu gom rác sẽ ến hành xóa các Objc đó. Ở bước hứ ba, vùng nhớ của các Objc còn lạ sẽ được nén lạ và nằm lền kề nhau rong bộ nhớ Hap. Quá rình này sẽ gúp vệc cấp phá bộ nhớ cho Objc mớ ễ àng hơn.

Ở vùng nhớ Hap được cha làm 3 vùng nhớ nhỏ hơn, ạm gọ là Young gnraon, Ol gnraon và Prmann gnraon.

Young gnraon: được cha hành nhều vùng nhớ nhỏ hơn là En(khở ạo) và Survvor(sống só). Các Objc vừa được khở ạo sẽ nằm ở vùng En, sau chu kì qué đầu ên nếu Objc đó còn ồn ạ hì sẽ được chuyển sang vùng Survvor. Tạ đây cá Objc được GC ho õ lên ục, nếu  như qua nhều chu kì qué mà Objc vẫn còn được sử ụng hì lúc này Objc sẽ được chuyển sang vùng nhớ hứ hứ ha.

Ol gnraon: là nơ chứa những Objc òn ạ đủ "lâu", còn "lâu" như hế nào hì lạ ùy huộc vào huậ oán của ừng bộ GC.

Prmann gnraon: không chứa Objc mà đây là nơ để chứa các maaa của JVM như các class và mho của ứng ụng. Do đó nếu các class và

mho không còn được sử ụng nữa hì GC sẽ co chúng là "rác" và ọn ẹp nó.

Ưu và nhược đểm

Trong C++, sau kh khở ạo mộ Objc, các lập rình vên phả chủ động xóa vùng nhớ của Objc bằng câu lệnh l, nếu như không hực hện vệc này hì sẽ ẫn đến rò rỉ vùng nhớ. Vớ Garbag Collcors, lập rình vên Java sẽ không cần quan âm đến vệc xóa các Objc mỗ lần ra khỏ hàm hay không còn ùng nữa. Tuy nhên, đánh đổ lạ vệc đó là hệu suấ của chương rình sẽ bị gảm đáng kể. Có bao gờ bạn hỏ mộ chương rình cùng hực hện mộ chức năng, cùng mộ oupu nhưng ốc độ hực h của C++ lúc nào cũng nhanh hơn Java, đúng vậy không nào? Trong kh vệc ranh luận về quản lý bộ nhớ ếp ục nổ ra, Garbag Collcors gờ đây là hành phần êu chuẩn của nhều ngôn ngữ lập rình phổ bến. Đố vớ các kịch bản nơ các Garbag Collcors ảnh hưởng êu cực đến hệu suấ, Java đề xuấ nhều lựa chọn để đều chỉnh cho các ến rình Garbag Collcors để cả hện hệu quả của nó.

Tạm kế

Vệc hểu rõ ưu và nhược đểm của ừng ngôn ngữ sẽ gúp bạn lựa chọn ngôn ngữ hích hợp để phá rển ứng ụng, vì suy cho cùng ngôn ngữ cũng chỉ là công cụ, sử ụng hệu quả hay không phụ huộc rấ nhều vào ngườ phá rển ứng ụng!

Garbag Collcon là kỹ huậ được sử ụng rong Java để phân bổ hoặc loạ bỏ các đố ượng không hể ruy cập và bộ nhớ không sử ụng. Ngay ừ cá ên, chúng a có hể hểu rằng Garbag Collcon lên quan đến vệc ho õ và xóa rác khỏ vùng nhớ.

Tuy nhên, rên hực ế, Garbag Collcon ho õ ừng đố ượng có sẵn rong không gan hap JVM và loạ bỏ những đố ượng không sử ụng.

Chúng a bế rằng ấ cả các đố ượng mà chúng a ạo động đều được cấp phá rong bộ nhớ hap của ứng ụng. Thông hường, lập rình vên có nhệm vụ vừa ạo vừa xóa các đố ượng rong chương rình, nhưng lập rình vên hường bỏ qua vệc xóa đố ượng. Đều này ạo ra vấn đề OuOfMmoryErrors o không đủ bộ nhớ vì không xóa các đố ượng không mong muốn.

Trong Java, lập rình vên không phả lo lắng về vấn đề gả phóng bộ nhớ của các đố ượng không sử ụng hoặc không mong muốn này, vì hệ hống Garbag Collcon luôn chạy ở chế độ nền và mục đích chính của nó là gả phóng bộ nhớ hap bằng cách xóa các đố ượng không hể ruy cập.

Về cơ bản, Garbag Collcon rong Java là quá rình ho õ ấ cả các đố ượng vẫn còn được sử ụng và đánh ấu phần còn lạ của chúng là rác. Quá rình Gom rác rong Java được co là mộ lược đồ quản lý bộ nhớ ự động vì ngườ lập rình không phả định vị các đố ượng mộ cách rõ ràng. Tập hợp rác rong Java chạy rên các luồng có mức độ ưu ên hấp.

Vệc rển kha Garbag Collcon có rong JVM (Máy ảo Java). Mỗ JVM có hể hực hện Garbag Collcon. Nhưng chỉ có mộ yêu cầu; rằng nó phả đáp ứng đặc đểm kỹ huậ JVM. Oracl's HoSpo là mộ rong những JVM phổ bến nhấ cung cấp mộ ập hợp các ùy chọn Garbag Collcon mạnh mẽ và hoàn hện.

Vòng đờ đố ượng rong Java

Vòng đờ đố ượng rong Java có hể được cha hành 3 ga đoạn:

1. Tạo đố ượng

Nó chung, để ạo mộ đố ượng, chúng ô sử ụng mộ ừ khóa nw. Ví ụ:

MyClass obj = nw MyClass () ;

Chúng a đã ạo đố ượng obj của lớp MyClass. Kh chúng a ạo đố ượng, mộ lượng bộ nhớ cụ hể sẽ được cấp phá để lưu rữ đố ượng đó. Lượng bộ nhớ được cấp phá cho các đố ượng có hể hay đổ ùy ho kến ​​rúc và JVM.

2. Đố ượng sử ụng

Trong ga đoạn này, Đố ượng được sử ụng bở các đố ượng khác của ứng ụng rong Java. Trong quá rình sử ụng, đố ượng nằm rong bộ nhớ và có hể ham chếu hoặc chứa ham chếu đến các đố ượng khác.

3. Sự phá hủy đố ượng

Hệ hống Garbag Collcon gám sá các đố ượng và gữ số lượng ham chếu đến ừng đố ượng. Không cần các đố ượng như vậy rong chương rình của chúng a nếu không có ham chếu đến đố ượng này, vì vậy vệc phân bổ bộ nhớ không sử ụng này là đều hoàn hảo.

Đố ượng không hể ruy cập rong Java

Kh mộ đố ượng không chứa bấ kỳ ham chếu “có hể ruy cập” nào đố vớ nó, hì chúng a gọ nó là đố ượng không hể ruy cập. Các đố ượng này cũng có hể được gọ là đố ượng không ham chếu.

Ví ụ về các đố ượng không hể ruy cập: 

Doubl = nw Doubl(5.6); // h nw Doubl objc s rachabl va h rfrnc n '' = null; // h Ingr objc s no longr rachabl. Now s an unrachabl objc.

Tính đủ đều kện để Garbag Collcon rong Java

Mộ đố ượng có hể đủ đều kện để Garbag Collcon rong Java nếu và chỉ kh nó không hể ruy cập được. Trong chương rình rên, sau kh kha báo là null; đố ượng kép 4 rong vùng đống rở nên đủ đều kện để Garbag Collcon.

Tính đủ đều kện của đố ượng

Mặc ù Java có ính năng Garbag Collcon ự động, nhưng mộ đố ượng phả được hực hện ho cách hủ công. Có nhều cách khác nhau để bế lệu đố ượng có đủ đều kện cho Bộ sưu ập rác rong Java hay không.

Nó chung, có bốn cách rong Java để làm cho mộ đố ượng đủ đều kện để Garbag Collcon:

    Vô hệu hóa bến ham chếuGán lạ bến ham chếuĐảo cô lậpTạo các đố ượng bên rong mộ lớp

Các cách yêu cầu JVM chạy Garbag Collcon

Ngay cả kh chúng ô làm cho mộ đố ượng đủ đều kện để Garbag Collcon rong Java, nó có hể đủ đều kện hoặc không đủ đều kện để Máy ảo Java (JVM) phá hủy. Vì vậy, có mộ số cách để yêu cầu JVM hủy đố ượng này và hực hện Garbag Collcon.

Có ha cách để yêu cầu JVM để hu hập Rác rong Java là:

    Sử ụng phương hức Sysm.gc() Sử ụng phương hức Runm.gRunm().gc() 

Thuậ oán của Garbag Collcon rong Java

Thuậ oán của Garbag Collcon rong Java gúp loạ bỏ các đố ượng không được ham chếu hoặc không hể ruy cập. Các huậ oán này luôn chạy ở chế độ nền. Có mộ số loạ bộ huậ oán Garbag Collcon khác nhau rong Java chạy ở chế độ nền. Và rong số đó, mộ rong những huậ oán là huậ oán Đánh ấu và Qué.

Thuậ oán đánh ấu và qué

Thuậ oán Đánh ấu và Qué là mộ huậ oán cơ bản và ban đầu để Garbag Collcon rong Java. Thuậ oán này về cơ bản hực hện ha chức năng chính: đánh ấu và qué. Thứ nhấ, nó sẽ ho õ và phá hện các đố ượng không hể ruy cập và hứ ha, nó sẽ gả phóng các đố ượng này khỏ vùng bộ nhớ hap để lập rình vên có hể sử ụng lạ.

1. Đánh ấu pha - Đánh ấu các đố ượng sống

Đây là ga đoạn đầu ên của huậ oán, rong đó có vệc phá hện ấ cả các đố ượng vẫn còn sống. Đây là ga đoạn mà bộ Garbag Collcon xác định phần nào của bộ nhớ đang được sử ụng và phần nào không được sử ụng.

Trong pha này kh đều kện được hực hện, b kểm ra của nó được đặ hành 0 hoặc sa. Chúng ô đặ b được đánh ấu hành 1 hoặc ru cho ấ cả các đố ượng có hể ruy cập.

Ở đây chúng a có hể co mỗ đố ượng là mộ nú và sau đó chúng a ruy cập ấ cả các đố ượng hoặc nú có hể ruy cập được ừ đố ượng / nú này và nó lặp lạ cho đến kh chúng a đã ruy cập ấ cả các nú có hể ruy cập.

    Gốc là mộ bến ham chếu đến mộ đố ượng và có hể ruy cập rực ếp bở mộ bến cục bộ. Chúng a sẽ cho rằng chúng a chỉ có mộ gốc.Chúng a có hể sử ụng markB (obj) để ruy cập b đánh ấu cho mộ đố ượng.

Thuậ oán đánh ấu pha

Mark(roo) If markB(roo) = fals hn markB(roo) = ru For ach v rfrnc by a roo Mark(v)

&g;&g;&g; Đọc hêm: Consrucor Channg rong Java - Tấ ần ậ về Consrucor Channg

2. Ga đoạn qué - Loạ bỏ các vậ chế

Thuậ oán pha qué “xóa” ấ cả các đố ượng không hể ruy cập hoặc không hể ruy cập được, nó gả phóng vùng bộ nhớ được lưu rữ cho ấ cả các đố ượng không hể ruy cập. Mỗ mục có gá rị kểm ra được đặ hành fals sẽ bị xóa khỏ bộ nhớ ngăn xếp, đố vớ mọ đố ượng có hể ruy cập khác, chúng ô đặ gá rị của b được đóng ấu hành fals.

Hện ạ, b kểm ra cho ấ cả các đố ượng có hể ruy cập được đặ hành fals.

Thuậ oán hu hập qué:

Swp() For ach objc p n a hap If markB(p) = ru hn markB(p) = fals ls hap.rlas(p)

Thuậ oán 'Mark an Swp' còn được gọ là bộ Garbag Collcon ho õ vì huậ oán này được sử ụng để ho õ các đố ượng. Ví ụ:

    Các b được đánh ấu được đặ hành fals.Các đố ượng có hể ếp cận được đặ hành ru.Các đố ượng không hể ếp cận được xóa khỏ đống.

Ưu đểm của huậ oán đánh ấu và qué

    Đó là mộ quá rình uần hoàn.Không có ch phí bổ sung nào xảy ra rong quá rình hực h mộ huậ oán.

Nhược đểm của huậ oán đánh ấu và qué

    Trong kh huậ oán Garbag Collcon Java chạy, vệc hực h chương rình bình hường sẽ ừng lạ.Nó chạy khác nhau nhều lần rên mộ chương rình.

&g;&g;&g; Đọc hêm:  Hướng ẫn JDBC rong Java - Kến rúc, hành phần và cách làm vệc

Ưu đểm và nhược đểm của Garbag Collcon rong Java

Ưu đểm của vệc Garbag Collcon:

    Không cần phả xử lý vệc cấp phá / phân bổ bộ nhớ ho cách hủ công vì JVM ự động hực hện vệc Garbag Collcon cho không gan chưa sử ụng rong Java.Không có ch phí xử lý Con rỏ nguy hểm.Garbag Collcon sẽ xử lý ố phần quản lý Rò rỉ Bộ nhớ Tự động (Auomac Mmory Lak managmn)..

Nhược đểm của vệc Garbag Collcon:

    Yêu cầu nhều hơn về sức mạnh của CPU bên cạnh ứng ụng gốc, vì JVM phả ho õ quá rình ạo / xóa ham chếu đố ượng. Đều này có hể ảnh hưởng đến hệu suấ của các yêu cầu đò hỏ mộ bộ nhớ lớn.Lập rình vên không có bấ kỳ quyền kểm soá nào đố vớ vệc lập lịch hờ gan CPU ành rêng cho vệc gả phóng các đố ượng không hể ruy cập.Sử ụng mộ số rển kha Garbag Collcon, ứng ụng có hể ừng không hể đoán rước.Quản lý bộ nhớ ự động không hệu quả nhều kh phân bổ / phân bổ bộ nhớ hủ công hích hợp.

Kế luận: 

Garbag Collcon rong Java rấ hữu ích để ngăn chặn rò rỉ bộ nhớ và sử ụng không gan. Trong hướng ẫn Java này, chúng a đã ìm hểu về Garbag Collcon rong Java và cách hoạ động của nó. Chúng a đã hảo luận về các đều khoản quan rọng lên quan đến Java Garbag Collcon và các huậ oán Garbag Collcon. Có bốn loạ Trình Garbag Collcon Java mà chúng a đã ìm hểu rong bà vế này. Chúng ô đã hảo luận về huậ oán Java Mark và Swp cùng vớ những ưu và nhược đểm của nó. Chúng a cũng đã xm xé những ưu đểm và nhược đểm của Garbag Collcon rong Java. 

Hy vọng bạn đã nắm rõ và Garbag Collcon và có hể áp ụng nó rong chương rình của mình. Tìm hểu hêm về Java và các ngôn ngữ lập rình khác qua các khóa học lập rình ạ Vện công nghệ hông n T3H.