Python vm so với jvm

Tại Stackify, chúng tôi cũng đấu tranh với phần lớn các vấn đề về hiệu suất mã, bao gồm các vấn đề xung quanh bộ sưu tập rác Java. Trong bài đăng này, chúng ta sẽ xem xét bộ sưu tập rác của Java, cách thức hoạt động của nó và tại sao nó lại quan trọng

Định nghĩa về Java Garbage Collection

Bộ sưu tập rác Java là quá trình mà các chương trình Java thực hiện quản lý bộ nhớ tự động. Các chương trình Java biên dịch thành mã byte có thể chạy trên Máy ảo Java hoặc viết tắt là JVM. Khi các chương trình Java chạy trên JVM, các đối tượng được tạo trên heap, đây là một phần bộ nhớ dành riêng cho chương trình. Cuối cùng, một số đối tượng sẽ không còn cần thiết. Trình thu gom rác tìm thấy các đối tượng không sử dụng này và xóa chúng để giải phóng bộ nhớ

Bộ sưu tập rác Java hoạt động như thế nào

Thu gom rác Java là một quá trình tự động. Lập trình viên không cần đánh dấu rõ ràng các đối tượng cần xóa. Việc triển khai thu gom rác tồn tại trong JVM. Mỗi JVM có thể thực hiện thu gom rác theo cách nó muốn; . Mặc dù có nhiều JVM, nhưng HotSpot của Oracle cho đến nay là phổ biến nhất. Nó cung cấp một bộ tùy chọn thu gom rác mạnh mẽ và trưởng thành

Mặc dù HotSpot có nhiều bộ thu gom rác được tối ưu hóa cho các trường hợp sử dụng khác nhau, nhưng tất cả các bộ thu gom rác của nó đều tuân theo cùng một quy trình cơ bản. Trong bước đầu tiên, các đối tượng không được ước tính được xác định và đánh dấu là đã sẵn sàng để thu gom rác. Trong bước thứ hai, các đối tượng được đánh dấu sẽ bị xóa. Theo tùy chọn, bộ nhớ có thể được nén sau khi trình thu gom rác xóa các đối tượng, vì vậy các đối tượng còn lại nằm trong một khối liền kề ở đầu heap. Quá trình nén giúp dễ dàng cấp phát bộ nhớ cho các đối tượng mới một cách tuần tự sau khi khối bộ nhớ được cấp phát cho các đối tượng hiện có

Tất cả các trình thu gom rác của HotSpot đều thực hiện chiến lược thu gom rác thế hệ phân loại các đối tượng theo độ tuổi. Cơ sở lý luận đằng sau việc thu gom rác thế hệ là hầu hết các đối tượng đều tồn tại trong thời gian ngắn và sẽ sẵn sàng để thu gom rác ngay sau khi tạo

Hình ảnh qua Wikipedia

Heap được chia thành ba phần

  • Thế hệ trẻ. Các đối tượng mới được tạo bắt đầu trong Thế hệ trẻ. Thế hệ trẻ được chia nhỏ hơn thành một không gian Eden, nơi tất cả các đối tượng mới bắt đầu và hai không gian Survivor, nơi các đối tượng được chuyển từ Eden sau khi sống sót sau một chu kỳ thu gom rác. Khi các đối tượng được thu gom rác từ Thế hệ trẻ, đó là một sự kiện thu gom rác nhỏ
  • thế hệ cũ. Các đối tượng tồn tại lâu dài cuối cùng được chuyển từ Thế hệ trẻ sang Thế hệ cũ. Khi các đối tượng được thu gom rác từ Thế hệ cũ, đó là một sự kiện thu gom rác lớn
  • Thế hệ vĩnh viễn. Siêu dữ liệu như các lớp và phương thức được lưu trữ trong Thế hệ vĩnh viễn. Các lớp không còn được sử dụng có thể là rác được thu thập từ Thế hệ vĩnh viễn

Trong một sự kiện thu gom rác đầy đủ, các đối tượng không sử dụng trong tất cả các thế hệ sẽ được thu gom rác

HotSpot có bốn bộ thu gom rác

  • nối tiếp. Tất cả các sự kiện thu gom rác được tiến hành tuần tự trong một luồng. Nén được thực hiện sau mỗi lần thu gom rác
  • Song song. Nhiều luồng được sử dụng để thu gom rác nhỏ. Một luồng duy nhất được sử dụng để thu gom rác lớn và nén Thế hệ cũ. Ngoài ra, biến thể Parallel Old sử dụng nhiều luồng để thu gom rác lớn và nén Thế hệ cũ
  • CMS [Quét đánh dấu đồng thời]. Nhiều luồng được sử dụng để thu gom rác nhỏ bằng thuật toán giống như Parallel. Bộ sưu tập rác chính là đa luồng, giống như Parallel Old, nhưng CMS chạy đồng thời cùng với các quy trình ứng dụng để giảm thiểu sự kiện “dừng thế giới” [i. e. khi trình thu gom rác đang chạy sẽ dừng ứng dụng]. Không có đầm nén được thực hiện
  • G1 [Rác đầu tiên]. Trình thu gom rác mới nhất nhằm mục đích thay thế cho CMS. Nó song song và đồng thời giống như CMS, nhưng nó hoạt động hoàn toàn khác so với các trình thu gom rác cũ hơn

Lợi ích của Java Garbage Collection

Lợi ích lớn nhất của bộ sưu tập rác Java là nó tự động xử lý việc xóa các đối tượng không sử dụng hoặc các đối tượng nằm ngoài tầm với để giải phóng các tài nguyên bộ nhớ quan trọng. Các lập trình viên làm việc với các ngôn ngữ không có bộ sưu tập rác [như C và C++] phải triển khai quản lý bộ nhớ thủ công trong mã của họ

Mặc dù phải làm thêm công việc, một số lập trình viên vẫn ủng hộ việc quản lý bộ nhớ thủ công hơn là thu gom rác, chủ yếu vì lý do kiểm soát và hiệu suất. Trong khi cuộc tranh luận về các phương pháp quản lý bộ nhớ tiếp tục diễn ra gay gắt, thì bộ sưu tập rác hiện là một thành phần tiêu chuẩn của nhiều ngôn ngữ lập trình phổ biến. Đối với các tình huống trong đó trình thu gom rác ảnh hưởng tiêu cực đến hiệu suất, Java cung cấp nhiều tùy chọn để điều chỉnh trình thu gom rác để cải thiện hiệu quả của nó

Các phương pháp hay nhất về thu gom rác Java

Đối với nhiều ứng dụng đơn giản, bộ sưu tập rác Java không phải là thứ mà lập trình viên cần cân nhắc một cách có ý thức. Tuy nhiên, đối với những lập trình viên muốn nâng cao kỹ năng Java của mình, điều quan trọng là phải hiểu cách thức hoạt động của bộ sưu tập rác Java và cách điều chỉnh nó.

Bên cạnh các cơ chế cơ bản của thu gom rác, một trong những điểm quan trọng nhất cần hiểu về thu gom rác trong Java là nó không mang tính quyết định và không có cách nào để dự đoán khi nào việc thu gom rác sẽ diễn ra trong thời gian chạy. Có thể bao gồm một gợi ý trong mã để chạy trình thu gom rác với Hệ thống. gc[] hoặc Thời gian chạy. gc[], nhưng chúng không đảm bảo rằng trình thu gom rác sẽ thực sự chạy

Cách tiếp cận tốt nhất để điều chỉnh bộ sưu tập rác Java là đặt cờ trên JVM. Cờ có thể điều chỉnh bộ thu gom rác được sử dụng [e. g. Nối tiếp, G1, v.v. ], kích thước ban đầu và tối đa của heap, kích thước của các phần heap [e. g. Thế hệ trẻ, Thế hệ già], v.v. Bản chất của ứng dụng đang được điều chỉnh là hướng dẫn ban đầu tốt cho cài đặt. Ví dụ: Trình thu gom rác song song hiệu quả nhưng sẽ thường xuyên gây ra các sự kiện “dừng thế giới”, làm cho nó phù hợp hơn cho quá trình xử lý phụ trợ trong đó tạm dừng dài để thu gom rác có thể chấp nhận được

Mặt khác, trình thu gom rác CMS được thiết kế để giảm thiểu thời gian tạm dừng, làm cho nó trở nên lý tưởng cho các ứng dụng GUI trong đó khả năng phản hồi là quan trọng. Tinh chỉnh bổ sung có thể được thực hiện bằng cách thay đổi kích thước của heap hoặc các phần của nó và đo lường hiệu quả thu gom rác bằng công cụ như jstat

Hãy dùng thử Prefix, trình lược tả mã miễn phí của Stackify, để viết mã tốt hơn trên máy trạm của bạn. Tiền tố hoạt động với. NET, Java, PHP, Nút. js, Ruby và Python

Chủ Đề