Computer >> Máy Tính >  >> Lập trình >> Java

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


Bất cứ khi nào chúng ta chạy một chương trình java, hệ điều hành sẽ cấp phát một số bộ nhớ cho JVM. JVM chia bộ nhớ này thành hai phần. Một là bộ nhớ Stack và một là bộ nhớ Heap. Một ngăn xếp được sử dụng để thực thi các phương thức và heap được sử dụng để lưu trữ các đối tượng. Khi Stack đầy, JVM ném java.lang.StackOverflowError và khi heap đầy, JVM ném java.lang.OutOfMemoryError.

StackOverflowError

  • Một ngăn xếp được sử dụng để thực thi các phương thức. Đối với mỗi lệnh gọi phương thức, một khối được tạo trong bộ nhớ ngăn xếp
  • Dữ liệu liên quan đến phương pháp như tham số, biến cục bộ hoặc tham chiếu đến các đối tượng được lưu trữ trong khối này.
  • Khi phương thức kết thúc quá trình thực thi, khối này sẽ bị xóa khỏi ngăn xếp cùng với dữ liệu được lưu trữ trong đó.
  • Bất cứ khi nào chúng ta gọi một phương thức, phương thức đó phải kết thúc quá trình thực thi và rời khỏi bộ nhớ ngăn xếp.
  • Nếu các phương thức vẫn ở trong ngăn xếp thì ngăn xếp sẽ đầy và JVM sẽ ném java.lang.StackOverflowError.

OutOfMemoryError

  • Các đối tượng chúng tôi đã tạo trong Java được lưu trữ trong bộ nhớ heap. Khi các đối tượng không được yêu cầu nữa, chúng phải được xóa khỏi bộ nhớ.
  • Trình thu gom rác sẽ xóa các đối tượng không mong muốn khỏi bộ nhớ heap.
  • Nếu các đối tượng của chúng tôi có tham chiếu trực tiếp, trình thu gom rác sẽ không xóa chúng. Nó chỉ xóa những đối tượng không có tham chiếu trực tiếp.
  • Bất cứ khi nào chúng ta gọi một phương thức, phương thức đó phải kết thúc quá trình thực thi và rời khỏi bộ nhớ ngăn xếp.
  • Nếu không còn chỗ trống cho các đối tượng mới trong bộ nhớ heap thì JVM sẽ ném java.lang.OutOfMemoryError.