Biến tĩnh được phân bổ cho toàn bộ thời gian thực hiện của chương trình, do đó, không phải ngăn xếp cũng không thuận tiện cho nó. Vậy nó ở đâu? Nên có một số nơi nó được nạp?Vị trí bộ nhớ thực tế cho các biến tĩnh là gì?
Trả lời
Trường tĩnh được khởi tạo khi một lớp được tải và bị loại bỏ khi trình nạp lớp cho lớp đó được tải xuống. Chúng có thể được dọn dẹp, thậm chí được nhân đôi trong một trình nạp lớp khác.
Đối với các ứng dụng như những ứng dụng này sử dụng OSGi, các biến tĩnh không tồn tại trong suốt thời gian của ứng dụng có thể được tải lại nhiều lần.
Cách triển khai này có thể là phụ thuộc JVM nhưng Sun/Oracle JVM tạo một "đối tượng" để giữ các trường tĩnh cho một lớp. Đối tượng này có thể truy cập thông qua lớp Unsafe cũng có thể được sử dụng để kiểm tra các trường "đối tượng" này.
Từ http://www.daniweb.com/software-development/java/threads/34695: bộ nhớ
tĩnh biến được phân bổ vào lúc bắt đầu của chương trình, trong bộ nhớ thông thường, thay vì ngăn xếp (bộ nhớ dành riêng cho chương trình ). lợi thế của việc này là rằng nó làm cho biến của bạn hoặc thủ tục hoàn toàn không đổi và bạn không thể vô tình thay đổi giá trị. bất lợi của điều này là bộ nhớ không được phân bổ cho đến khi chương trình bị chấm dứt. Tôi chưa bao giờ nghe bất cứ điều gì giá trị tĩnh mất bất kỳ bộ nhớ nào nhiều hơn nếu chúng là được khai báo thường xuyên, nhưng bộ nhớ cao hơn sử dụng là không đổi.
-1: "Hoàn toàn không đổi"? Bạn đang nghĩ về 'cuối cùng'? Và trí nhớ không được giải phóng cho đến khi kết thúc; đó không phải là một bất lợi, đó là toàn bộ điểm của 'tĩnh'! –
@OliCharlesworth, Anh ấy đang nói về các biến 'static final'. Và bị buộc phải sử dụng nhiều bộ nhớ hơn trong một khoảng thời gian dài hơn là một bất lợi so với việc không phải làm điều đó. – Pacerier
Biến tĩnh được phân bổ cho toàn bộ thời gian thực thi chương trình, do đó, không phải chồng và đống thuận tiện cho nó.
Thực tế, các khung tĩnh (tức là các khung giữ các biến tĩnh) được cấp phát từ vùng heap.
Và chúng không nhất thiết tồn tại trong thời gian thực thi chương trình. Ví dụ, các khung tĩnh cho các lớp được nạp động có thể được thu thập rác nếu bộ nạp lớp cha, tất cả các lớp và tất cả các cá thể trở nên không thể truy cập được.
Chúng tôi có 3 phân đoạn trong bộ nhớ của chúng tôi:
stack Segment — chứa các biến cục bộ và biến tham chiếu (các biến mà giữ địa chỉ của một đối tượng trong heap).
Phân đoạn heap — chứa tất cả các đối tượng đã tạo trong thời gian chạy, đối tượng chỉ cộng với thuộc tính đối tượng của chúng (biến mẫu).
Phân đoạn mã — phân đoạn nơi các mã bytecode Java được biên dịch thực sự nằm khi được tải. Thành viên tĩnh (biến hoặc phương thức) được gọi là thành viên lớp, có nghĩa là chúng cư trú ở nơi lớp (bytecode) cư trú, nằm trong Phân đoạn mã.
câu trả lời này được bỏ phiếu rất nhiều, nhưng mâu thuẫn với http://stackoverflow.com/questions/3849634/static-allocation-in-java-heap-stack-and-permanent-generation/3849819#3849819 – ravindrab
Sourav, bạn có thể cung cấp cho các nguồn của bạn xin vui lòng? –
Có lẽ Sourav đề cập đến C++? – flow2k
Out of năm lĩnh vực bộ nhớ rằng JVM sử dụng, các lĩnh vực tĩnh được phân bổ bộ nhớ trong Class Diện tích (một phần của PremGen) khi lớp được nạp bởi ứng dụng lớp loader trong chuẩn bị và giai đoạn tải. Nếu trường là nguyên thủy, giá trị được lưu trữ trong vùng lớp và nếu nó là kiểu đối tượng (toán tử mới được sử dụng), nó được lưu trữ trong heap nhưng tham chiếu được gán cho biến trường tĩnh được gán trong vùng lớp. Khi lớp được tải xuống, bộ nhớ cho trường tĩnh đó cũng có sẵn để thu gom rác do GC thu thập.
Nếu trường là cuối cùng, đó là, cuối cùng tĩnh, nó được giữ trong hồ bơi không đổi theo khu vực lớp học.
- 1. Việc sử dụng biến số thực tế là gì?
- 2. Sử dụng biến tĩnh cho dữ liệu bộ nhớ cache
- 3. Vị trí của bộ nhớ đệm ASP.NET
- 4. vị trí bộ nhớ trong chuỗi unicode
- 5. GMSMapView Vị trí của tôi không đưa ra vị trí thực tế
- 6. SDK Android thực tế dựa trên vị trí
- 7. Vị trí bộ nhớ của giá trị enum trong C
- 8. Làm thế nào để lưu trữ một biến tại một vị trí bộ nhớ cụ thể?
- 9. "Bộ nhớ đệm" là gì?
- 10. Vị trí là gì: tương đối hữu ích cho?
- 11. Bộ nhớ được cấp phát cho một biến tĩnh như thế nào?
- 12. Xác nhận hoặc NSAssert tốt cho thực tế là gì?
- 13. SQLite: giới hạn thực tế là gì?
- 14. mẫu vị trí bộ nhớ trên ngăn xếp và đống
- 15. Cần tìm vị trí thực tế của dòng/char trong các lỗi của Internet Explorer Script?
- 16. Cà ri JavaScript: các ứng dụng thực tế là gì?
- 17. Lợi ích thực tế của ADO.NET Entity Framework là gì?
- 18. Vị trí trong bộ nhớ là đối tượng được đặt khi chúng được tạo trong một khối tĩnh?
- 19. Chrome nhớ vị trí cuộn
- 20. Thay đổi vị trí bộ nhớ đệm cục bộ của gradle cho tạo đám mây Jenkins
- 21. So sánh bộ nhớ (với vị trí khác biệt)
- 22. Android: Biến tĩnh null trên bộ nhớ thấp
- 23. Đang tải DLL từ một vị trí trong bộ nhớ
- 24. Vị trí của một chuỗi là gì?
- 25. Thực hành tốt nhất cho vị trí của tệp cấu hình ứng dụng Java là gì?
- 26. Xác định xem vị trí bộ nhớ có trong bộ nhớ cache CPU
- 27. 'Cách thực hành tốt nhất' cho vị trí của nhật ký dịch vụ windows là gì?
- 28. Vị trí bộ nhớ cache của Internet Explorer
- 29. Phương pháp và biến tĩnh là gì?
- 30. biến cục bộ của các hàm thành viên tĩnh
cũng xem: http://www.daniweb.com/software-development/java/threads/34695 – mnicky
@mnicky Cảm ơn bạn !!! nó rất hữu dụng. – Reuben
có thể trùng lặp của [một phương thức tĩnh và một biến tĩnh được lưu trữ trong java. Trong heap hoặc trong bộ nhớ ngăn xếp] (http://stackoverflow.com/questions/8387989/where-is-a-static-method-and-a-static-variable-stored-in-java-in-heap-or- in-sta) –