2011-07-04 28 views
19

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ì?

+2

cũng xem: http://www.daniweb.com/software-development/java/threads/34695 – mnicky

+0

@mnicky Cảm ơn bạn !!! nó rất hữu dụng. – Reuben

+0

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) –

Trả lời

15

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.

1

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

-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'! –

+1

@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

7

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.

24

Chúng tôi có 3 phân đoạn trong bộ nhớ của chúng tôi:

  1. 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).

  2. 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).

  3. 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ã.

+6

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

+3

Sourav, bạn có thể cung cấp cho các nguồn của bạn xin vui lòng? –

+1

Có lẽ Sourav đề cập đến C++? – flow2k

1

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.

Các vấn đề liên quan