Các phương thức tĩnh (trên thực tế là tất cả các phương thức) cũng như các biến tĩnh được lưu trữ trong PermGen
phần của heap, vì chúng là một phần của dữ liệu phản chiếu (dữ liệu liên quan đến lớp, không liên quan đến cá thể).
Cập nhật để làm rõ :
Lưu ý rằng chỉ các biến và giá trị kỹ thuật của chúng (nguyên thủy hoặc tham chiếu) được lưu trữ trong không gian PermGen.
Nếu biến tĩnh của bạn là một tham chiếu đến một đối tượng thì bản thân đối tượng đó được lưu trữ trong các phần bình thường của heap (thế hệ trẻ / già hoặc không gian sống sót). Các đối tượng đó (trừ khi chúng là các đối tượng bên trong như các lớp, v.v.) không được lưu trữ trong không gian PermGen.
Thí dụ:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Một từ về thu gom rác:
Đừng không dựa vào finalize()
là nó không được bảo đảm để chạy. JVM hoàn toàn phụ thuộc vào quyết định khi nào chạy bộ thu gom rác và những gì cần thu gom, ngay cả khi một đối tượng đủ điều kiện để thu gom rác.
Tất nhiên bạn có thể đặt một biến tĩnh thành null và do đó xóa tham chiếu đến đối tượng trên heap nhưng điều đó không có nghĩa là trình thu gom rác sẽ thu thập nó (ngay cả khi không còn tham chiếu nào nữa).
Ngoài ra, finalize()
chỉ chạy một lần, vì vậy bạn phải đảm bảo rằng nó không ném ra các ngoại lệ hoặc ngăn cản việc thu thập đối tượng. Nếu bạn tạm dừng hoàn thiện thông qua một số ngoại lệ, finalize()
sẽ không được gọi trên cùng một đối tượng lần thứ hai.
Lưu ý cuối cùng : cách lưu trữ mã, dữ liệu thời gian chạy, v.v. phụ thuộc vào JVM được sử dụng, tức là HotSpot có thể làm điều đó khác với JRockit và điều này thậm chí có thể khác nhau giữa các phiên bản của cùng một JVM. Phần trên dựa trên HotSpot cho Java 5 và 6 (về cơ bản chúng giống nhau) vì tại thời điểm trả lời, tôi muốn nói rằng hầu hết mọi người đã sử dụng các JVM đó. Do những thay đổi lớn trong mô hình bộ nhớ của Java 8, các câu lệnh trên có thể không đúng với Java 8 HotSpot - và tôi đã không kiểm tra các thay đổi của Java 7 HotSpot, vì vậy tôi đoán những điều trên vẫn đúng với phiên bản đó, nhưng tôi không chắc ở đây.