Phân bổ bộ nhớ trong Java là gì? Bộ nhớ ngăn xếp và đống



Bài viết dựa trên 'Phân bổ bộ nhớ trong Java' này sẽ giúp bạn có kiến ​​thức chi tiết về cấp phát bộ nhớ cùng với cấu trúc dữ liệu Stack và Heap.

Cấp phát bộ nhớ là một quá trình mà các chương trình và dịch vụ máy tính được chỉ định bằng vật lý hoặc ảo ký ức không gian. Trong bài viết này, chúng ta sẽ tìm hiểu về cấp phát bộ nhớ trong và chúng ta sẽ thảo luận về Stack và Heap Memory.

Bộ nhớ ngăn xếp là gì?

Bộ nhớ ngăn xếp Java được sử dụng để thực thi một luồng. Chúng chứa các giá trị dành riêng cho phương thức tồn tại trong thời gian ngắn và các tham chiếu đến các đối tượng khác trong heap được tham chiếu từ phương thức.





Cây rơm bộ nhớ luôn được tham chiếu trong LIFO (Từ cuối vào trước) đặt hàng. Bất cứ khi nào một phương thức được gọi, một khối mới sẽ được tạo trong bộ nhớ ngăn xếp để phương thức đó chứa các giá trị nguyên thủy cục bộ và tham chiếu đến các đối tượng khác trong phương thức.

Ngay sau khi phương thức kết thúc, khối sẽ không được sử dụng và có sẵn cho phương thức tiếp theo.



thuật toán sắp xếp c ++

Kích thước bộ nhớ ngăn xếp nhỏ hơn rất nhiều so với bộ nhớ Heap.

Các tính năng chính của bộ nhớ ngăn xếp

Ngoài những gì chúng ta đã thảo luận cho đến nay, sau đây là một số tính năng khác của Cây rơm ký ức:

  • Nó phát triển và thu nhỏ khi các phương thức mới được gọi và trả về tương ứng
  • Các biến bên trong ngăn xếp chỉ tồn tại miễn là phương thức tạo ra chúng đang chạy
  • Nó là tự động được phân bổ và phân bổ khi phương thức kết thúc thực thi
  • Nếu bộ nhớ này đầy, Java sẽ ném java.lang.StackOverFlowError
  • Quyền truy cập vào bộ nhớ này là Nhanh khi so sánh với bộ nhớ heap
  • Kỷ niệm này là chỉ an toàn vì mỗi luồng hoạt động trong ngăn xếp của riêng nó

Các phương thức trong lớp Stack

  • Đối tượng đẩy ( Phần tử đối tượng ): Đẩy một phần tử lên đầu ngăn xếp.
  • Đối tượng pop (): Loại bỏ và trả về phần tử trên cùng của ngăn xếp. An ‘EmptyStackException’ ngoại lệ được ném ra nếu chúng ta gọi pop () khi ngăn xếp đang gọi trống.
  • Đối tượng peek (): Trả về phần tử trên đầu ngăn xếp, nhưng không xóa phần tử đó.
  • Boolean trống (): Nó trả về true nếu không có gì ở trên cùng của ngăn xếp. Khác, trả về false.
  • int search ( Phần tử đối tượng ): Nó xác định xem một đối tượng có tồn tại trong ngăn xếp hay không. Nếu phần tử được tìm thấy, nó trả về vị trí của phần tử từ trên cùng của ngăn xếp. Ngược lại, nó trả về -1.

Mã Java để triển khai ngăn xếp

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {for (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

// Đầu ra



cách sử dụng lớp máy quét trong java

memory-allocation-in-java

Bây giờ, chúng ta hãy chuyển sang Heap Space.

Heap Space trong Java

Bộ nhớ được cấp phát trong quá trình thực thi các lệnh do người lập trình viết. Lưu ý rằng tên heap không liên quan gì đến cấu trúc dữ liệu heap. Nó được gọi là heap vì nó là một đống không gian bộ nhớ có sẵn cho các lập trình viên phân bổkhử phân bổ. Nếu một lập trình viên không xử lý tốt bộ nhớ này, rò rỉ bộ nhớ có thểxảy ra trong chương trình.

cách xử lý cửa sổ bật lên trong selen

Các tính năng chính của bộ nhớ đống Java

  • Ngoài những gì chúng ta đã thảo luận cho đến nay, sau đây là một số tính năng khác của heap space:
  • Nó được truy cập thông qua các kỹ thuật quản lý bộ nhớ phức tạp bao gồm Thế hệ trẻ, già hoặc là Thế hệ có thời hạn,Thế hệ vĩnh viễn
  • Nếu không gian heap đầy, Java sẽ ném java.lang.OutOfMemoryError
  • Truy cập vào bộ nhớ này tương đối chậm hơn bộ nhớ ngăn xếp
  • Bộ nhớ này, trái ngược với ngăn xếp, không được phân bổ tự động. Nó cần Người thu gom rác để giải phóng các đối tượng không sử dụng để duy trì hiệu quả sử dụng bộ nhớ
  • Không giống như ngăn xếp, một đống không chỉ an toàn và cần được bảo vệ bằng cách đồng bộ hóa mã đúng cách

Sự khác biệt giữa Java Heap Space và Stack Memory

Dựa trên những giải thích trên, chúng ta có thể dễ dàng kết luận sự khác biệt sau đây giữa ĐốngCây rơm ký ức.

  • Đống bộ nhớ được sử dụng bởi tất cả các phần của ứng dụng trong khi bộ nhớ ngăn xếp chỉ được sử dụng bởi một luồng thực thi.
  • Bất cứ khi nào một đối tượng được tạo, đối tượng đó luôn được lưu trữ trong không gian Heap và bộ nhớ ngăn xếp chứa tham chiếu đến nó. Bộ nhớ ngăn xếp chỉ chứa biến nguyên thủy cục bộbiến tham chiếu tới các đối tượng trong không gian đống.
  • Các đối tượng được lưu trữ trong heap có thể truy cập toàn cầu trong khi các luồng khác không thể truy cập vào bộ nhớ ngăn xếp.
  • Quản lý bộ nhớ trong ngăn xếp được thực hiện trong một LIFO trong khi nó phức tạp hơn trong bộ nhớ Heap vì nó được sử dụng trên toàn cầu. Bộ nhớ đống được chia thành Thế hệ trẻ, thế hệ già vv, thêm chi tiết tại Bộ sưu tập rác Java.
  • Bộ nhớ ngăn xếp là tồn tại ngắn ngủi trong khi bộ nhớ heap tồn tại từ đầu cho đến khi kết thúc quá trình thực thi ứng dụng.
  • Chúng ta có thể sử dụng -XMX -XMS Tùy chọn JVM để xác định kích thước khởi động và kích thước tối đa của bộ nhớ heap. Chúng ta có thể sử dụng -XSS để xác định kích thước bộ nhớ ngăn xếp.
  • Khi bộ nhớ ngăn xếp đầy, thời gian chạy Java sẽ ném java.lang.StackOverFlowError trong khi nếu bộ nhớ heap đầy, nó sẽ ném java.lang.OutOfMemoryError: Không gian đống Javalỗi.
  • Kích thước bộ nhớ ngăn xếp nhỏ hơn rất nhiều khi so sánh với bộ nhớ Heap. Vì sự đơn giản trong cấp phát bộ nhớ (LIFO), bộ nhớ ngăn xếp rất nhanh khi so sánh vớiđống bộ nhớ.

Biểu đồ so sánh

THAM SỐ CÂY RƠM HEAP
Căn bản Bộ nhớ được cấp phát trong một khối liền kềBộ nhớ được cấp phát theo thứ tự ngẫu nhiên
Phân bổ và Giao dịch Tự động bằng trình biên dịchHướng dẫn bởi Lập trình viên
Giá cả Ít hơnHơn
Thực hiện CứngDễ dàng
Thời gian truy cập Nhanh hơnChậm hơn
Vấn đề chính Thiếu bộ nhớPhân mảnh bộ nhớ
Vị trí của sự khác biệt Thông minhĐầy đủ
Uyển chuyển Tỷ lệ cố địnhCó thể thay đổi kích thước

Với điều này, chúng ta sẽ kết thúc Hướng dẫn “Phân bổ bộ nhớ trong Java” này. Tôi hy vọng bạn đã hiểu khái niệm và cách triển khai nó thông qua một số ví dụ thời gian thực.

Bây giờ bạn đã hiểuPhân bổ bộ nhớ trong Javacơ bản thông qua bài viết “Phân bổ bộ nhớ trong Java” này, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Các khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Mùa xuân .

Có một câu hỏi cho chúng tôi? Đề cập đến nó trong phần nhận xét của blog “Phân bổ bộ nhớ trong Java” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.