Xem Nhiều 2/2023 #️ Phân Biệt Heap Memory Và Stack Memory Trong Java # Top 7 Trend | Sansangdethanhcong.com

Xem Nhiều 2/2023 # Phân Biệt Heap Memory Và Stack Memory Trong Java # Top 7 Trend

Cập nhật thông tin chi tiết về Phân Biệt Heap Memory Và Stack Memory Trong Java mới nhất trên website Sansangdethanhcong.com. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất.

Phân biệt Heap memory và Stack memory trong java.

Bộ nhớ Heap – Heap Memory

Heap memory là bộ nhớ được sử dụng bởi Java Runtime để cấp phát bộ nhớ cho các đối tượng (object) và String.

Bất kỳ khi nào có một đối tượng được tạo, nó sẽ được tạo lưu ở bộ nhớ Heap.

Bộ dọn rác (Garbage Collection) chạy trên heap memory để giải phóng bộ nhớ được sử dụng bởi các đối tượng có bất kỳ tham chiếu nào.

Bộ nhớ Stack – Stack Memory

Stack memory được sử dụng cho quá trình thực thi của mỗi thread.

Stack memory bao gồm các giá trị cụ thể của method: các biến local và các tham chiếu tới các đối tượng chứa ở trong heap memory được tham chiếu bởi method.

Stack memory được tham chiếu theo thứ tự LIFO (Last In First Out – vào cuối cùng thì ra đầu tiên). Tức là lưu trữ kiểu ngăn xếp (stack). Khi có một method được thực thi, một block được tạo ra trong stack memory để chứa các biến nguyên thủy local và các tham chiếu tới các object. Khi method kết thúc, block đó sẽ không còn được sử dụng và được phục vụ cho method tiếp theo.

Stack memory có kích thước rất nhỏ so với Heap memory.

Ví dụ 1:

Dòng thứ 1: khi khai báo int i = 4 nó sẽ đưa i = 4 vào stack

Dòng thứ 2: khi khai báo y = 2 nó sẽ đưa y = 2 vào stack (xếp trên i = 4)

Dòng thứ 3: khi khai báo class1 cls1 = new class1(): đây là kiểu đối tượng nên nó sẽ tạo đối tượng cls1 trong heap đồng thời chưa tham chiếu của đối tượng cls1 vào stack (xếp trên cùng trong stack)

Sau khi kết thúc method, bộ nhớ trong stack được giải phóng, còn bộ nhớ trong heap thì chưa. Bộ nhớ trong heap phải chờ cho tới khi garbage collector (bộ dọn rác) của Java quét qua để giải phóng.

Ví dụ 2:

Tương tự như ví dụ trên nhưng với trường hợp đối tượng cụ thể:

Điều đặc biệt ở đây là khi bạn khai báo String name = "kai". Giá trị "kai" sẽ được lưu trong String pool và biến name trong stack thực hiện tham chiếu tới “kai“. (String là kiểu dữ liệu đặc biệt, giá trị của nó luôn được lưu trong String pool)

Khi bạn khai báo Person p = new Person(age, name) nó sẽ tạo đối tượng p với age, name tương ứng vào bộ nhớ heap và thêm biến tham chiếu tới đối tượng p vào bộ nhớ tack.

Phân biệt Heap với Stack:

Okay, Done!

References:

https://docs.oracle.com/…/garbage_collect.html

https://gurunguns.wordpress.com/…/stack-heap-value-types-reference-types-boxing-and-unboxing/

Sự Khác Biệt Giữa Stack Và Heap

Nội Dung:

Định nghĩa về ngăn xếp

Phân bổ ngăn xếp tuân theo chiến lược LIFO (Lần đầu ra trước) để gán bộ nhớ cho các quy trình với sự trợ giúp của thao tác đẩy và bật. Mỗi khối trong bộ nhớ có kích thước cố định không thể mở rộng hoặc ký hợp đồng. Mục cuối cùng trong ngăn xếp có thể truy cập bất cứ lúc nào. Ngăn xếp sử dụng một bộ nhớ liền kề trong đó một con trỏ có tên là cơ sở ngăn xếp trỏ đến mục nhập đầu tiên của ngăn xếp và một con trỏ khác có tên là đỉnh của ngăn xếp trỏ đến mục cuối cùng của ngăn xếp.

Stack cũng hỗ trợ các cuộc gọi chức năng. Một lệnh gọi hàm có thể chứa một tập hợp các mục ngăn xếp, được gọi là khung ngăn xếp. Một tên khác của khung stack là bản ghi kích hoạt trong con của trình biên dịch vì nó lưu trữ dữ liệu được sử dụng tại thời điểm biên dịch chương trình. Bất cứ khi nào một chức năng được gọi là khung ngăn xếp được đẩy vào ngăn xếp.

Khung ngăn xếp bao gồm một trong hai địa chỉ hoặc giá trị của tham số hàm và địa chỉ trả về có nghĩa là nơi điều khiển sẽ được trả về sau khi hoàn thành thực thi chức năng.

Định nghĩa của Heap

Phân bổ heap không theo bất kỳ cách tiếp cận xác định; thay vào đó, nó cho phép gán ngẫu nhiên và phân bổ lại bộ nhớ. Một yêu cầu gán bởi một tiến trình trả về với một con trỏ tới vùng nhớ được phân bổ trong một đống và quá trình truy cập vào vùng nhớ được phân bổ thông qua con trỏ.

Giao dịch được thực hiện thông qua yêu cầu thỏa thuận, giống với ngăn xếp nơi bộ nhớ được giải phóng tự động. Heap phát triển các lỗ hổng trong phân bổ bộ nhớ khi cấu trúc dữ liệu được xây dựng và giải phóng. Nó được sử dụng trong thời gian chạy.

Trong một ngăn xếp, việc phân bổ và phân bổ được thực hiện bởi CPU và tự động trong khi, trong heap, nó cần phải được lập trình viên thực hiện thủ công.

Xử lý khung heap tốn kém hơn xử lý khung stack.

Thực hiện một ngăn xếp là phức tạp. Như chống lại, thực hiện một đống là đơn giản.

Một lệnh gọi hàm trong stack mất thời gian O (N). Ngược lại, phải mất O (1) thời gian trong một đống.

Thực hiện ngăn xếp chủ yếu bị vấn đề thiếu bộ nhớ. Ngược lại, vấn đề chính trong một đống là sự phân mảnh.

Truy cập vào khung ngăn xếp dễ dàng hơn heap vì ngăn xếp bị giới hạn trong vùng bộ nhớ nhỏ và nó luôn nhấn vào bộ đệm, nhưng các khung heap bị phân tán trong bộ nhớ nên việc truy cập bộ nhớ có thể khiến bộ nhớ cache bị mất nhiều hơn.

Ngăn xếp không linh hoạt, kích thước bộ nhớ được phân bổ không thể thay đổi. Mặt khác, một đống là linh hoạt, và bộ nhớ được phân bổ có thể được thay đổi.

Một đống mất nhiều thời gian truy cập hơn một ngăn xếp.

Phần kết luận

Phân bổ ngăn xếp nhanh hơn nhưng phức tạp. Mặt khác, một đống chậm hơn, nhưng việc thực hiện nó đơn giản hơn một chồng. Heap hiệu quả hơn stack.

Class Stack Trong Java ” Cafedev.vn

Trong bài này, chúng ta sẽ tìm hiểu về class Stack trong Java và các hàm của nó qua các ví dụ.

Collections framework trong Java có một class tên là Stack cung cấp chức năng của cấu trúc dữ liệu stack.

Class Stack là một class phụ của class Vector.

1. Triển khai class stack

Trong class stack, các phần tử được lưu trữ và truy cập theo cơ chế Last In First Out. Có nghĩa là, stack giống như một ngăn xếp thẳng đứng, các phần tử được thêm vào stack theo chiều từ dưới lên và loại bỏ khỏi stack theo chiều từ trên xuống.

Để tạo một stack, đầu tiên, chúng ta phải import gói java.util.Stack. Khi chúng ta đã nhập gói, chúng ta có thể tạo một stack trong Java theo cách sau đây.

Ở đây, Type là kiểu dữ liệu của stack. Ví dụ,

Vì stack là class phụ của class vector, nó kế thừa tất cả các hàm của Vector. Để tìm hiểu về các hàm Vector khác nhau , hãy truy cập Class Vector trong Java .

Bên cạnh các hàm này, class Stack còn có thêm 5 hàm khác với Vector.

Để thêm một phần tử vào đầu stack, chúng ta sử dụng hàm push(). Ví dụ,

Kết quả

Stack: [Dog, Horse, Cat]

Để loại bỏ một phần tử khỏi đỉnh stack, chúng ta sử dụng hàm pop(). Ví dụ,

Kết quả

Initial Stack: [Dog, Horse, Cat] Removed Element: Cat

Các hàm peek() trả về đối tượng ở phía trên cùng của stack. Ví dụ,

Kết quả

Stack: [Dog, Horse, Cat] Element at top: Cat

Để tìm kiếm một phần tử trong stack, chúng ta sử dụng hàm search(). Nó trả về vị trí của phần tử ở đỉnh stack. Ví dụ,

Kết quả

Stack: [Dog, Horse, Cat] Position of Horse: 2

Để kiểm tra xem một stack có trống hay không, chúng ta sử dụng hàm empty(). Ví dụ,

Kết quả

Stack: [Dog, Horse, Cat] Is the stack empty? false

5. Dùng ArrayDeque thay vì dùng Stack

Class Stack triển khai trực tiếp cấu trúc dữ liệu stack. Tuy nhiên, chúng ta không nên sử dụng nó. Thay vào đó, nên sử dụng class ArrayDeque (class này triển khai Deque interface) để triển khai cấu trúc dữ liệu stack trong Java.

Sự Khác Nhau Giữa Bộ Nhớ Heap Và Bộ Nhớ Stack Trong Lập Trình Là Gì?

Bộ nhớ Heap và bộ nhớ Stack bản chất đều cùng là vùng nhớ được tạo ra và lưu trữ trong RAM khi chương trình được thực thi. Sự khác biệt cơ bản nhất giữa hai loại bộ nhớ này đó là bộ nhớ Stack được dùng để lưu trữ các biến cục bộ trong hàm, tham số truyền vào hàm, địa chỉ trả về của hàm trong khi bộ nhớ Heap được dùng để lưu trữ vùng nhớ cho các biến con trỏ được cấp phát động bởi các hàm malloc - calloc - realloc (trong C) hoặc từ khóa new (trong C++, Java,…).

Ví dụ trong ngôn ngữ lập trình C++:

Ngoài ra, còn rất nhiều trọng điểm để so sánh sự khác nhau giữa bộ nhớ Heap và bộ nhớ Stack như:

Kích thước vùng nhớ

Kích thước của bộ nhớ Stack là cố định, tùy thuộc vào từng hệ điều hành, ví dụ hệ điều hành Windows là 1 MB, hệ điều hành Linux là 8 MB (lưu ý là con số có thể khác tùy thuộc vào kiến trúc hệ điều hành của bạn).

Kích thước của bộ nhớ Heap là không cố định, có thể tăng giảm do đó đáp ứng được nhu cầu lưu trữ dữ liệu của chương trình.

Đặc điểm vùng nhớ.

Vùng nhớ Stack được quản lý bởi hệ điều hành, dữ liệu được lưu trong Stack sẽ tự động hủy khi hàm thực hiện xong công việc của mình.

Vùng nhớ Heap được quản lý bởi lập trình viên (trong C hoặc C++), dữ liệu trong Heap sẽ không bị hủy khi hàm thực hiện xong, điều đó có nghĩa bạn phải tự tay hủy vùng nhớ bằng câu lệnh free (trong C), và delete hoặc delete [] (trong C++), nếu không sẽ xảy ra hiện tượng rò rỉ bộ nhớ. Ở các ngôn ngữ lập trình bậc cao như .NET, Java, … đã có chế dọn rác tự động (Garbage Collection), bạn không cần phải tự tay hủy vùng nhớ Heap nữa.

Vấn đề lỗi xảy ra đối với vùng nhớ:

Bởi vì bộ nhớ Stack cố định nên nếu chương trình bạn sử dụng quá nhiều bộ nhớ vượt quá khả năng lưu trữ của Stack chắc chắn sẽ xảy ra tình trạng tràn bộ nhớ Stack (Stack overflow), các trường hợp xảy ra như bạn khởi tạo quá nhiều biến cục bộ, hàm đệ quy vô hạn,…

Ví dụ về tràn bộ nhớ Stack với hàm đệ quy vô hạn:

int foo(int x){ printf("De quy khong gioi hann"); return foo(x); }

Nếu bạn liên tục cấp phát vùng nhớ mà không giải phóng thì sẽ bị lỗi tràn vùng nhớ Heap (Heap overflow).

Nếu bạn khởi tạo một vùng nhớ quá lớn mà vùng nhớ Heap không thể lưu trữ một lần được sẽ bị lỗi khởi tạo vùng nhớ Heap thất bại.

Ví dụ trường hợp khởi tạo vùng nhớ Heap quá lớn:

int *A = (int *)malloc(18446744073709551615);

Khi nào nên sử dụng bộ nhớ Stack và bộ nhớ Heap

Khi bạn không biết chính xác cần bao nhiêu vùng nhớ là đủ để lưu trữ dữ liệu trong khi chương trình đang chạy thì dùng bộ nhớ Heap (ví dụ điển hình là cấp phát động của mảng), còn lại thì sử dụng bộ nhớ Stack.

Hoặc khi dữ liệu quá lớn vượt quá khả năng của Stack thì bạn nên dùng Heap.

Bạn đang xem bài viết Phân Biệt Heap Memory Và Stack Memory Trong Java trên website Sansangdethanhcong.com. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất. Chúc bạn một ngày tốt lành!