Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sự khác biệt giữa StackOverflowError và OutOfMemoryError trong Java


Khi chạy một chương trình Java, hệ điều hành cấp phát bộ nhớ cho JVM. JVM chia bộ nhớ này thành hai phần: bộ nhớ Stack (ngăn xếp) và bộ nhớ Heap (đống). Stack dùng để thực thi các phương thức, Heap dùng để lưu trữ đối tượng. Khi Stack đầy, JVM ném ra java.lang.StackOverflowError; khi Heap đầy, JVM ném ra java.lang.OutOfMemoryError.

StackOverflowError

  • Stack dùng cho việc thực thi phương thức. Mỗi lần gọi phương thức, một khối (frame) được tạo trong bộ nhớ Stack.
  • Dữ liệu liên quan đến phương thức như tham số, biến cục bộ hoặc tham chiếu đến đối tượng được lưu trong khối này.
  • Khi phương thức kết thúc thực thi, khối này bị loại bỏ khỏi Stack cùng với dữ liệu bên trong.
  • Mỗi lần gọi phương thức, nó phải kết thúc và rời khỏi bộ nhớ Stack.
  • Nếu các phương thức vẫn lưu giữ trong Stack, Stack sẽ đầy và JVM ném java.lang.StackOverflowError.

OutOfMemoryError

  • Các đối tượng tạo ra trong Java được lưu trong bộ nhớ Heap. Khi đối tượng không còn cần thiết, chúng phải được giải phóng khỏi bộ nhớ.
  • Bộ thu gom rác (Garbage Collector) loại bỏ các đối tượng không còn được tham chiếu từ Heap.
  • Nếu đối tượng vẫn có tham chiếu sống (live references), Garbage Collector sẽ không xóa chúng. Nó chỉ xóa những đối tượng không có tham chiếu sống.
  • Mỗi lần gọi phương thức, nó phải kết thúc và rời khỏi bộ nhớ Stack (đây là lặp lại từ phần StackOverflowError, thực tế ở đây nên nói về Heap).
  • Nếu không còn không gian cho đối tượng mới trong Heap, JVM ném java.lang.OutOfMemoryError.