Bộ nhớ ngăn xếp là gì?
Stack trong java là một phần của bộ nhớ chứa các phương thức, biến cục bộ và biến tham chiếu. Bộ nhớ ngăn xếp luôn được tham chiếu theo thứ tự từ trước đến trước. Biến cục bộ được tạo trong ngăn xếp.
Bộ nhớ Heap là gì?
Heap là một phần của bộ nhớ chứa các Đối tượng và cũng có thể chứa các biến tham chiếu. Biến sơ thẩm được tạo trong heap
Phân bổ bộ nhớ trong Java
JVM chia bộ nhớ thành các phần sau.
- Heap
- Stack
- Code
- Static
Sự phân chia bộ nhớ này là cần thiết để quản lý hiệu quả của nó.
- Phần code chứa bytecode của bạn .
- Phần Stack của bộ nhớ chứa các phương thức, biến cục bộ và biến tham chiếu.
- Phần Heap chứa các Đối tượng (cũng có thể chứa các biến tham chiếu).
- Phần Static chứa dữ liệu / phương thức tĩnh .
Sự khác biệt giữa biến cục bộ và biến thể
Biến sơ thẩm được khai báo bên trong một lớp nhưng không nằm trong một phương thức
class Student{
int num; // num is instance variable
public void showData{}
Biến cục bộ được khai báo bên trong một phương thức bao gồm các đối số phương thức .
public void sum(int a){
int x = int a + 3;
// a , x are local variables;
}
Sự khác biệt giữa Stack và Heap
Hãy lấy một ví dụ để hiểu điều này tốt hơn.
Hãy xem xét rằng phương thức gọi phương thức chính của bạn m1
public void m1{
int x=20
}
Trong ngăn xếp java, một khung sẽ được tạo từ phương thức m1.
Biến X trong m1 cũng sẽ được tạo trong khung cho m1 trong ngăn xếp. (Xem hình dưới đây).
Phương thức m1 đang gọi phương thức m2. Trong ngăn xếp java, một khung mới được tạo cho m2 trên đỉnh của khung m1.
Biến b và c cũng sẽ được tạo trong khung m2 trong ngăn xếp.
public void m2(int b){
boolean c;
}
Cùng một phương thức m2 là gọi phương thức m3. Một lần nữa, một khung m3 được tạo ra trên đỉnh của ngăn xếp (xem hình ảnh bên dưới).
Bây giờ giả sử phương thức m3 của chúng ta đang tạo một đối tượng cho lớp "Tài khoản", có hai trường hợp biến int p và int q.
Account {
Int p;
Int q;
}
Đây là mã cho phương thức m3
public void m3(){
Account ref = new Account();
// more code
}
Câu lệnh Account mới () sẽ tạo một đối tượng của tài khoản heap.
Biến tham chiếu "ref" sẽ được tạo trong ngăn xếp java.
Toán tử gán "=" sẽ tạo một biến tham chiếu để trỏ đến đối tượng trong Heap.
Khi phương thức đã hoàn thành việc thực hiện. Luồng điều khiển sẽ quay trở lại phương thức gọi. Mà trong trường hợp này là phương pháp m2.
Các ngăn xếp từ phương pháp m3 sẽ được tuôn ra.
Vì biến tham chiếu sẽ không còn được trỏ đến đối tượng trong heap, nên nó sẽ đủ điều kiện để thu gom rác.
Khi phương thức m2 đã hoàn thành việc thực hiện. Nó sẽ được bật ra khỏi ngăn xếp và tất cả các biến của nó sẽ bị xóa và không còn có sẵn để sử dụng.
Tương tự như vậy đối với phương thức m1.
Cuối cùng, luồng điều khiển sẽ trở về điểm bắt đầu của chương trình. Mà thông thường, là phương pháp "chính".
Điều gì xảy ra nếu Object có một tham chiếu là biến đối tượng của nó?
public static void main(String args[]) {
A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
Trong trường hợp này, biến tham chiếu "con" sẽ được tạo thành từng đống, đến lượt nó sẽ được trỏ đến đối tượng của nó, giống như sơ đồ hiển thị bên dưới.
Tóm lược:
- Khi một phương thức được gọi, một khung được tạo trên đỉnh của ngăn xếp.
- Khi một phương thức đã thực hiện xong, luồng điều khiển quay trở lại phương thức gọi và khung ngăn xếp tương ứng của nó được tuôn ra.
- Biến cục bộ được tạo trong ngăn xếp
- Các biến sơ thẩm được tạo trong heap & là một phần của đối tượng mà chúng thuộc về.
- Các biến tham chiếu được tạo trong ngăn xếp.
إرسال تعليق