Slide Baocao NLNNLT

April 30, 2018 | Author: Anonymous | Category: Documents
Report this link


Description

CÁC THÀNH VIÊN NHÓM 6 1. Đỗ Ngọc Anh (C) 2. Lâm Văn Ân 3. Nguyễn Hữu Hải 5. Trần Văn Minh 6. Nguyễn Minh Quang 7. Trần Đình Nam 4. Nguyễn Minh Hưng Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * ĐỀ BÀI Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Static typing and Dynamic typing Basic type NonBasic type/Programer - defined Reference Counting NGUYÊN LÝ CÁC NGÔN NGỮ LẬP TRÌNH Garbage Collection Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT TYPE (KIỂU) - Trong giới hạn môn học, nhắc đến kiểu ta hiểu là kiểu của dữ liệu. -Người ta sử dụng thuật ngữ đối tượng dữ liệu (ÐTDL) để chỉ một nhóm của một hoặc nhiều mẩu dữ liệu trong máy tính ảo. - Kiểu dữ liệu là một tập hợp các ÐTDL và tập hợp các phép toán thao tác trên các ÐTDL đó. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * Static typing and Dynamic typing (Kiểm tra kiểu tĩnh và kiểm tra kiểu động) Kiểm tra kiểu là kiểm tra xem kiểu thực nhận được của các đối số trong một phép toán có đúng với kiểu dữ liệu mà các đối số đó cần có hay không. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Static typing (Kiểm tra kiểu tĩnh) - Kiểm tra kiểu tĩnh là sự kiểm tra kiểu được thực hiện trong quá trình dịch chương trình. - Theo nguyên tắc kiểm tra kiểu tĩnh, thông tin về kiểu của ÐTDL phải được cung cấp cho bộ dịch. - Thông tin này một phần được cung cấp bởi phép khai báo của người lập trình và một phần bởi ngôn ngữ. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Static typing (Kiểm tra kiểu tĩnh) Ưu điểm: • Do phép kiểm tra kiểu tĩnh kiểm tra tất cả các phép toán có thể xuất hiện trong bất kỳ một lệnh nào của chương trình, tất cả các nhánh của chương trình đều được kiểm tra nên không thể có sự sót lỗi về kiểu. • Mặt khác thông tin về kiểu không gắn với ÐTDL tại thời điểm thực hiện chương trình nên tiết kiệm được bộ nhớ và tăng tốc độ thực hiện chương trình. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Static typing (Kiểm tra kiểu tĩnh)   Nhược điểm: Yếu điểm chủ yếu của kiểm tra kiểu tĩnh là chương trình không mềm dẻo, người lập trình luôn phải lo lắng về việc sử dụng biến không đúng kiểu. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Dynamic typing (Kiểm tra kiểu động) Kiểm tra kiểu động là kiểm tra kiểu được thực hiện trong khi thực hiện chương trình. Thông thường kiểm tra kiểu động được thực hiện một cách tức thì trước khi thực hiện một phép toán. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Dynamic typing (Kiểm tra kiểu động) Phương pháp thực hiện: - Ðể kiểm tra kiểu động người ta phải lưu trữ thông tin về kiểu của mỗi một ÐTDL cùng với ĐTDL đó. - Trước khi thực hiện một phép toán thông tin về kiểu của mỗi một đối số được kiểm tra. Nếu kiểu của các đối số là đúng thì phép toán sẽ được thực hiện và kiểu của kết quả sẽ được ghi lại để dùng kiểm tra cho các phép toán sau, ngược lại sẽ có một thông báo lỗi về kiểu . Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Dynamic typing (Kiểm tra kiểu động) Ưu điểm: Ưu điểm chủ yếu của kiểm tra kiểu động là tính mềm dẻo trong khi viết chương trình: không yêu cầu khai báo kiểu và kiểu của ÐTDL có thể thay đổi trong quá trình thực hiện chương trình. Người lập trình không phải lo lắng về kiểu dữ liệu. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Dynamic typing (Kiểm tra kiểu động) Nhược điểm: Có thể bỏ sót lỗi về kiểu. Bởi vì việc kiểm tra động chỉ kiểm tra tại thời điểm thực hiện phép toán do đó các phép toán nằm trong nhánh chương trình không được thực hiện thì sẽ không được kiểm tra. Bất kỳ một nhánh chưa được kiểm tra nào đều có thể chứa các đối số có lỗi về kiểu và do đó các lỗi này có thể xuất hiện tại thời điểm sau đó. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT import java.util.Scanner; public class StaticTyping { public StaticTyping() { constructor stub } public static void main(String[] args) { stub int a,b; String x; Scanner sc = new Scanner(System.in); System.out.println("Nhập số a : ");     a = sc.nextInt();     System.out.println("Nhập số b : ");     b = sc.nextInt(); Nhóm 6 - Lớp K13M CNTT     if(a>b)     {      //x = a + b;      //System.out.println("x = "+x);     } else     {      x = a + "titi";      //System.out.println("x = "+a+"titi");     }   } } Nhóm 6 - Lớp K13M CNTT Basic Type (Kiểu dữ liệu cơ bản) Nhóm 6 - Lớp K13M CNTT Số nguyên Số thực Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số Nhóm 6 - Lớp K13M CNTT Hầu hết các ngôn ngữ lập trình đều có các kiểu dữ liệu số, nhưng các chi tiết của sự đặc tả và phép cài đặt các kiểu này có nhiều điểm khác nhau. Kiểu số nguyên và kiểu số thực là phổ biến nhất bởi vì chúng dựa một cách trực tiếp vào phần cứng của máy tính. Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số nguyên Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số nguyên Nhóm 6 - Lớp K13M CNTT Sự cài đặt: Kiểu dữ liệu nguyên hầu hết được cài đặt một cách trực tiếp bằng cách dùng sự biểu diễn bộ nhớ được xác định bởi phần cứng và tập hợp các phép tính số học, các phép toán quan hệ nguyên thuỷ trong phần cứng cho các số nguyên. Thông thường sự biểu diễn này sử dụng một từ trong bộ nhớ hoặc một dãy các bytes để lưu trữ một số nguyên. Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số thực Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số thực Nhóm 6 - Lớp K13M CNTT Sự cài đặt: Sự biểu diễn bộ nhớ cho kiểu dữ liệu thực dấu chấm động dựa trên cơ sở biểu diễn phần cứng trong đó một ô nhớ được chia thành một phần định trị (mantissa) và một số mũ (exponent). Các phép tính số học và các phép toán quan hệ trên kiểu số thực được hỗ trợ bởi phần cứng. Các phép toán khác phải được ngôn ngữ cài đặt như là các chương trình con. Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu số thực Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu logic Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu logic gồm các ÐTDL có một trong hai giá trị đúng hoặc sai. Các phép toán phổ biến trên kiểu logic gồm có: Nhóm 6 - Lớp K13M CNTT Kiểu dữ liệu Ký tự (Char) Nhóm 6 - Lớp K13M CNTT Kiểu ký tự là một liệt kê được định nghĩa bởi ngôn ngữ tương ứng với một tập hợp ký tự chuẩn được cho bởi phần cứng và hệ điều hành như tập các ký tự ASCII (8-bits) chẳng hạn. Bảng mã Unicode (16 bit) được đưa vào Java, C# Các phép toán trên dữ liệu ký tự bao gồm: các phép toán quan hệ, phép gán, và đôi khi có phép kiểm tra xem một ký tự có thuộc một lớp đặc biệt "chữ cái", "chữ số" hoặc lớp ký tự xác định nào đó. Nhóm 6 - Lớp K13M CNTT NonBasic type/Programer - defined (Kiểu dữ liệu không cơ bản Do người lập trình định nghĩa) Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Enumerations (Dữ liệu kiểu liệt kê) Nhóm 6 - Lớp K13M CNTT Người lập trình định nghĩa kiểu liệt kê bằng cách liệt kê ra một danh sách các tên trực kiện thông qua sự khai báo. Các tên trực kiện trong danh sách là các giá trị của kiểu và thứ tự của chúng cũng được xác định nhờ thứ tự chúng xuất hiện trong danh sách. Ví dụ trong Java: public enum Day {hai, ba, bon, nam, sau, bay, cn} Nhóm 6 - Lớp K13M CNTT Enumerations (Dữ liệu kiểu liệt kê) Nhóm 6 - Lớp K13M CNTT  switch (day)     {       case hai:     return "Thứ 2";       case ba:    return "Thứ 3";       case bon:   return "Thứ 4";       case nam:     return "Thứ 5";       case sau:     return "Thứ 6";       case bay:     return "Thứ 7";       case cn:     return "Chủ nhật";       default:      return null;     } Nhóm 6 - Lớp K13M CNTT Enumerations (Dữ liệu kiểu liệt kê) Nhóm 6 - Lớp K13M CNTT Lợi ích của việc sử dụng kiểu liệt kê: Việc sử dụng kiểu liệt kê làm cho chương trình sáng sủa, trực quan, người lập trình không còn phải nhớ “nghĩa” của giá trị số và do vậy chương trình sẽ có độ chính xác cao hơn. Nói cách khác, kiểu liệt kê làm tăng tính dễ đọc, tính dễ viết và độ tin cậy của ngôn ngữ. Nhóm 6 - Lớp K13M CNTT Pointer (Dữ liệu kiểu con trỏ) Nhóm 6 - Lớp K13M CNTT Dữ liệu kiểu con trỏ là một ÐTDL sơ cấp chứa địa chỉ của khối ô nhớ được cấp phát. Người lập trình sử dụng ô nhớ được cấp phát thông qua biến con trỏ. Nhóm 6 - Lớp K13M CNTT Pointer (Dữ liệu kiểu con trỏ) Nhóm 6 - Lớp K13M CNTT Các phép toán: Phép toán cấp phát ô nhớ động: Phép toán này dùng để cấp phát ô nhớ cho đối tượng dữ liệu mới và trả địa chỉ của ô nhớ đó về trong biến con trỏ. Trong Pascal thì phép toán này có tên là NEW. Ví dụ: NEW(p). Phép toán truy xuất ô nhớ được cấp phát động: Ðể truy xuất đến giá trị dữ liệu lưu trong khối ô nhớ cấp phát động ta phải sử dụng địa chỉ của khối ô nhớ thông qua tên con trỏ (vì khối ô nhớ này không có tên). Ví dụ q^[5] là phần tử thứ 5 của véctơ Vect được trỏ bởi q. Phép toán thu hồi ô nhớ được cấp phát động: Phép toán này cho phép giải phóng ô nhớ đã cấp phát. Trong Pascal, dùng phép toán DISPOSE. Nhóm 6 - Lớp K13M CNTT Pointer (Dữ liệu kiểu con trỏ) Nhóm 6 - Lớp K13M CNTT Type Vect = ARRAY[1..10] of Integer; {Lúc này bộ nhớ cho Vect chưa được cấp phát} VAR p: ^Vect; {Khai báo p là một biến con trỏ chứa địa chỉ của khối ô nhớ lưu trữ ÐTDL thuộc kiểu véctơ Vect. Khi dịch đến đây thì ô nhớ cho p sẽ được cấp phát} Begin NEW(p); {Cấp phát ô nhớ cho véctơ và trả địa chỉ của ô nhớ này cho biến con trỏ p (hay còn nói p trỏ tới khối ô nhớ này)} p^[5] := 20; {Truy xuất đến phần tử thứ 5 của véctơ} writeln(p^[5]); Dispose(p); {Giải phóng ô nhớ đã cấp cho véctơ} End. Nhóm 6 - Lớp K13M CNTT Array (Mảng) Mảng 1 chiều (còn gọi là véc tơ) Mảng một chiều là một CTDL bao gồm một số cố định các phần tử có kiểu giống nhau được tổ chức thành một dãy tuần tự các phần tử. Như vậy mảng một chiều là một CTDL có kích thước cố định và đồng nhất. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Mảng 1 chiều (còn gọi là véc tơ) Các thuộc tính của mảng một chiều là: - Số lượng các phần tử, luôn được chỉ rõ bằng cách cho tập chỉ số. Tập chỉ số này thông thường được cho bởi một miền con các số nguyên. - Kiểu dữ liệu của mỗi một phần tử, thường được viết rõ trong khai báo. - Chỉ số được sử dụng để lựa chọn mỗi một phần tử. Nếu tập chỉ số được cho bởi một miền con của tập các số nguyên thì số nguyên đầu tiên chỉ định phần tử đầu tiên số nguyên thứ 2 chỉ định phần tử thứ 2 ...Nếu tập chỉ số là một liệt kê thì giá trị đầu tiên trong liệt kê là chỉ số của phần tử đầu tiên. Nếu ngôn ngữ chỉ định rõ số lượng các phần tử thì 0 là chỉ số của phần tử đầu tiên. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Mảng 1 chiều (còn gọi là véc tơ) Ví dụ: char s[] = new char[100]; Khai báo mảng một chiều s có 100 phần từ là các ký tự. Các thành phần của mảng: s[0] đến s[99]. Để truy xuất tới phần tử thứ i của s, ta sử dụng cú pháp: s[i] Lấy số phần tử của s ta dùng cú pháp: s.length Khởi tạo giá trị ban đầu của mảng: Char s[] = {a,b,c,d,e,f} Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String(Chuỗi ký tự) Chuỗi ký tự là cấu trúc dữ liệu bao gồm một dãy các ký tự. Như vậy, kiểu chuỗi ký tự là một kiểu đồng nhất, còn về kích thước thì có thể cố định hoặc thay đổi tùy theo ngôn ngữ. Kiểu dữ liệu chuỗi ký tự là một kiểu quan trọng mà hầu hết các ngôn ngữ đều có. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String(Chuỗi ký tự) Các cách khai báo trong Java: public static void main(String a[]){         String objStr_01 = "This is a string object";         String objStr_02 = new String("This is also string object");         char[] arrChar = {'V','N','L','I','V','E','S'};         String objStr_03 = new String(arrChar);         String objStr_04 = objStr_03 + " This is another String object";                  System.out.println("objStr_01: " + objStr_01);         System.out.println("objStr_02: " + objStr_02);         System.out.println("objStr_03: " + objStr_03);         System.out.println("objStr_04: " + objStr_04);              } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String (Chuỗi ký tự) Đặc tả các thuộc tính: a/ Ðộ dài được khai báo cố định: Chuỗi ký tự có thể có độ dài (kích thước) cố định được khai báo trong chương trình. Ðây là kỹ thuật cơ bản được dùng trong COBOL b/ Ðộ dài thay đổi trong một giới hạn đã được khai báo: Chuỗi ký tự có thể có độ dài cực đại được khai báo trước trong chương trình nhưng giá trị thực của đối tượng dữ liệu được lưu trữ có thể là chuỗi có độ dài ngắn hơn, thậm chí có thể là chuỗi rỗng. Ðây là kỹ thuật được dùng trong PL/1 (và cả trong Turbo Pascal). c/ Ðộ dài không giới hạn: Chuỗi ký tự có thể có độ dài bất kỳ và độ dài có thể thay đổi một cách động thông qua quá trình thực hiện. Ðây là kỹ thuật được dùng trong SNOBOL4. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String (Chuỗi ký tự) Các phép toán: a/ Viết hoa một chuỗi public class StringUpperCase {          public static void main(String[] args) {                  String objStr = "vnlives.net";         System.out.println("objStr: " + objStr.toUpperCase());     } } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String (Chuỗi ký tự) Các phép toán: b/ Viết thường một chuỗi public class StringLowerCase {          public static void main(String[] args) {                  String objStr = "VNLIVES.NET";         System.out.println("objStr: " + objStr.toUpperCase());     } } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT String (Chuỗi ký tự) Các phép toán: c/ Đếm tổng số ký tự của chuỗi public class StringLength {          public static void main(String[] args) {                  String objStr = "VNLIVES.NET";         System.out.println("objStr length: " + objStr.length());     } } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Record (Bản ghi) Bản ghi là một CTDL bao gồm một số cố định các phần tử có kiểu khác nhau. Như vậy, bản ghi là một CTDL có kích thước cố định và không đồng nhất. Các phần tử của bản ghi được gọi là các trường. Khai báo bản ghi trong Java: class Recorder {    String Ma;     String hoten;    int tuoi;    float luong; } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Record (Bản ghi) Các thuộc tính của một bản ghi phải được chỉ rõ trong phép khai báo, chúng bao gồm: 1. Số lượng các phần tử. 2. Kiểu dữ liệu của các phần tử (Các phần tử có thể có kiểu khác nhau). 3. Mỗi phần tử được cho bởi tên phần tử (tên trường). Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Record (Bản ghi) Các phép toán thực hiện trên bản ghi: 1. Phép lựa chọn một phần tử là phép toán cơ bản cuả bản ghi. Phép toán này được thực hiện bằng cách chỉ ra tên trực kiện của phần tử. Ví dụ: Nhan_vien.Ma; (Lấy ra giá trị của trường Ma trong bản ghi hay lấy mã của nhân viên) 2. Phép gán Ví dụ: Nhan_vien.hoten = "Nguyen van A"; Gán giá trị của trường hoten trong bản ghi bằng “Nguyen van A” Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Record (Bản ghi) Các phép toán thực hiện trên bản ghi: 1. Phép lựa chọn một phần tử là phép toán cơ bản cuả bản ghi. Phép toán này được thực hiện bằng cách chỉ ra tên trực kiện của phần tử. Ví dụ: Nhan_vien.Ma; (Lấy ra giá trị của trường Ma trong bản ghi hay lấy mã của nhân viên) 2. Phép gán Ví dụ: Nhan_vien.hoten = "Nguyen van A"; Gán giá trị của trường hoten trong bản ghi bằng “Nguyen van A” Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Quản lý bộ nhớ và dọn rác Java quản lý bộ nhớ trong 1 vùng nhớ gọi là vùng HEAP. Để quản lý Heap, bộ nhớ được theo dõi qua 2 danh sách là : Danh sách các vùng nhớ chưa sử dụng. Danh sách các vùng đã cấp. Java sử dụng hai heap riêng biệt cho cấp phát vùng nhớ : heap tĩnh. heap động. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * Quy trình dọn rác chia ra như sau : Khi có yêu cầu về bộ nhớ, trình quản lý heap trước tiên kiểm tra danh sách bộ nhớ chưa cấp phát. Nếu không tìm thấy khối bộ nhớ nào phù hợp (về kích cỡ) thì trình dọn rác sẽ được kích hoạt khi hệ thống rỗi. Nhưng khi đòi hỏi bộ nhớ cấp bách thì trình dọn rác sẽ được kích hoạt ngay. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Các bước thực hiện trong cơ chế cấp bộ nhớ : Nhận yêu cầu cấp bộ nhớ. if (Free-Block list đủ) cấp bộ nhớ cho yêu cầu (First-fit) else if (máy rảnh) thực thi gom rác else ứng dụng phải gọi tường minh tác vụ gom rác. Trình gom rác được ấn định độ ưu tiên rất thấp nếu JVM rảnh thì mới gọi đến nó. Gọi tường minh có ý nghĩa chấp nhận ứng dụng này tạm dừng để chờ gom rác. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Cơ chế gom rác (chỉ gom rác ở Dynamic heap) Xem đối tượng nào không còn dùng. Trình dọn rác gọi phương thức finalize để thu tài nguyên của đối tượng trước khi dọn dẹp đối tượng. Hàm này sẽ dọn dẹp các tài nguyên bên ngoài như các file đang mở. Công việc này không được trình dọn rác thực thi Gọi trình dọn rác để thụ gom rác. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Giới thiệu về Reference Counting Garbage Collection Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Giống nhau Đều quản lý bộ nhớ, đều có cơ chế đếm các tham chiếu trỏ tới đối tượng trong bộ nhớ. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * Cơ chế hoạt động Garbage Collection (GC) là cơ chế tự động chạy ngầm để tìm những đối tượng dữ liệu không còn sử dụng nữa và giải phóng chúng bởi chương trình đang chạy. Reference Counting (RC) là cơ chế tự động đếm tham chiếu đến đối tượng trong bộ nhớ. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * GC hoạt động như thế nào ? Sử dụng cơ chế đếm? mỗi đối tượng có một số đếm các tham chiếu trỏ tới. giải phóng đối tượng khi số đếm = 0. Giải phóng các đối tượng chết kiểm tra tất cả các tham chiếu. đánh dấu các đối tượng còn được tham chiếu giải phóng các đối tượng không được tham chiếu Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * GC hoạt động như thế nào ? Trong java, các object được tạo ra và lưu vào một vùng nhớ gọi là HEAP và sẽ được Garbage Collection quản lý theo một cấu trúc hình cây. Garbage Collection sẽ thực hiện công việc của nó khi vùng nhớ Heap này full. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT RC hoạt động như thế nào ? Sử dụng cơ chế đếm? mỗi đối tượng có một số đếm các tham chiếu trỏ tới. Khi biến đếm tham chiếu bằng 0, vùng nhớ dành cho đối tượng có thể được giải phóng. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Quan hệ giữa RC và GC Trong việc thu thập rác của GC thì nó sẽ gặp vấn đề là tìm kiếm rác ở đâu ?. Một đối tượng được coi là rác khi không có tham chiếu tới đối tượng đó. Nhưng làm thế nào để chúng ta biết là không có tham chiếu tới nó ? JVM đã đưa ra cách giải quyết đó là theo dõi từng đối tượng trong tổng số các tham chiếu đến đối tượng đó. Có nghĩa là nó sẽ phải thêm một reference count cho từng đối tượng và JVM sẽ cập nhật các reference count đó. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Ví dụ 1: Ví dụ: Khi khai báo: Object p = new Integer (57); Ta đã tạo một thể hiện mới của lớp Integer và chỉ có biến p là đối tượng. Như vậy số tham chiếu của nó sẽ là một. Tiếp theo ta sẽ viết thêm là Object p = new Integer (57); Object q = p; Thì trong trường hợp này cả p,q đều tham chiếu đến cùng 1 đối tượng vậy nên tham chiếu của nó là 2. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Cơ chế chạy của JVM ở ví dụ 1 Khi ta tiến hành gán p=q; thì máy ảo JVM sẽ thực hiện như sau : if (p != q) { if (p != null) --p.refCount; p = q; if (p != null) ++p.refCount; } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Ví dụ 2 Ví dụ ta khai báo p và q như sau : Object p = new Integer (57); Object q = new Integer (99); Như vậy ta đã tạo ra 2 đối tượng kiểu integer và chúng đều có chung 1 thể hiện. Giả sử chúng ta gán q=p, sử dụng đoạn code phía trên thì cho thấy rằng sau khi gán thì Cả p và q đều tham chiếu đến cùng 1 đối tượng nên reference count của q sẽ là 2. Và số lượng tham chiếu trên p đã chỉ ra là đếm tham chiếu của nó bằng 0 và nó là rác. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Lợi thế của việc sử dụng reference count Dễ dàng xác định đối tượng nào còn sử dụng và đối tượng nào là rác. Chúng ta có thể tiết kiệm bộ nhớ nếu như chúng ta kiểm tra đối tượng có reference count của nó = 0 để chủ đông gọi quá trình thu gom rác để tận dụng tối đa bộ nhớ và giảm thiêu bộ nhớ bị bỏ trống xuống mức thấp nhất. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Cơ chế chạy của JVM khi có rác và ta chủ động dọn rác Trong ví dụ 2 nếu chủ động gọi cơ chế dọn rác thì Khi gán p=q thì máy ảo JVM sẽ thực hiện như sau : if (p != q) { if (p != null) if (--p.refCount == 0) heap.release (p); p = q; if (p != null) ++p.refCount; } Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Ưu điểm của GC là Giúp lập trình viên không phải xử lý giải phóng bộ nhớ khi lập trình (vốn gây ra lỗi trên các ngôn ngữ không sử dụng Garbage Collector), giảm thiểu Memory leaks. Bảo đảm tính toàn vẹn của chương trình java, GC cũng là một phần quan trọng trong khả năng bảo mật và tính an toàn của JVM. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Nhược điểm của GC là  Không cho phép người lập trình xác định được chính xác thời điểm object bị hủy khỏi bộ nhớ. Ảnh hưởng tới hiệu năng chương trình Trong phương thức finalize() thì người lập trình nên chủ động cài đặt một số thao tác giải phóng, dọn dẹp vùng nhớ đã cấp phát cho các đối tượng dữ liệu sẽ giúp cho kiểm soát tốt quá trình hủy đối tượng. Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT Chân thành cảm ơn Thầy và các bạn đã lắng nghe! Nhóm 6 - Lớp K13M CNTT Nhóm 6 - Lớp K13M CNTT * * * * * *


Comments

Copyright © 2025 UPDOCS Inc.