2011-01-10 23 views
5

phép nói rằng tôi có biến này:là nó có thể nhận được địa chỉ trên đống của một biến trong java?

... 
Somekindofobject var = new Somekindofobject(); 
... 

và tôi muốn biết nơi var nằm trên heap (theo địa chỉ, như 0x08 và vân vân), và để in địa chỉ ra.

là nó có thể?

+0

Nếu tất cả những gì bạn muốn làm là in đối tượng, bạn nhận được lợi ích gì khi biết vị trí của nó trên heap? Bạn đang thực sự cố gắng làm gì? – Anon

+0

@Anon: Tôi nghĩ anh ấy có nghĩa là in ra địa chỉ. –

+0

tôi đang làm việc trên một chương trình nhận được như là chương trình java đầu vào, và các công cụ mã in ra thông tin tập tin về truy cập biến. Cách duy nhất mà tôi có thể xác định giữa hai lĩnh vực đối tượng của cùng một lớp là bởi địa chỉ của họ trên heap. Vì vậy, tôi cần địa chỉ trên heap – RanZilber

Trả lời

8

tôi đang làm việc trên một chương trình mà được như chương trình java đầu vào, và các công cụ mã mà in ra để nộp thông tin về quyền truy cập khác nhau. Cách duy nhất mà tôi có thể xác định giữa hai trường đối tượng của cùng một lớp là theo địa chỉ trên heap. Do đó, tôi cần địa chỉ trên heap

Bạn có thể sử dụng System.identityHashCode để có khái niệm về mẫu. Nó không hoàn hảo, nhưng nó khá tốt. Nếu bạn nhận được địa chỉ heap của một đối tượng, hãy nhớ rằng JVM được phép di chuyển các đối tượng xung quanh (và thường xuyên khi một bộ gom rác thế hệ quảng bá một đối tượng sống lâu cho một thế hệ cũ). một proxy tốt cho danh tính trong mọi trường hợp.

+0

điều này có thể sẽ giải quyết vấn đề của OP rất tốt trên các hệ thống 32 bit. – irreputable

+0

System.identityHashCode là ngày nay được dựa trên một máy phát điện ngẫu nhiên với mỗi hạt giống thread – bestsss

+0

bạn có thể xây dựng? System.idenetityHashCode (var) cung cấp cho tôi những gì? Tôi cần somthing mà sẽ cho phép tôi để xác định giữa cùng một lĩnh vực trên một đối tượng khác nhau của cùng một lớp. – RanZilber

3

Bạn có thể đưa ra một thử về bài viết này của javaPaper: Address of a Java object

Đó là về việc sử dụng lớp Unsafe trong gói sun.misc để có được địa chỉ.

+0

Hoàn toàn đáng sợ. Lưu ý * Không an toàn * (tên đã được chọn vì một lý do) và * sun.misc * (một gói riêng "triển khai" riêng tư). Cũng lưu ý rằng đây là địa chỉ * logic * chứ không phải địa chỉ * vật lý *. 1 cho một bài viết thú vị. –

+0

+1 vì không an toàn, rất tốt. – bestsss

+1

Điều này sẽ cung cấp cho bạn địa chỉ của các trường trong một đối tượng, nhưng không phải là chính nó. –

1

Thậm chí nếu bạn quản lý để có được địa chỉ đống của đối tượng thì không có gì đảm bảo rằng khi bạn đã sử dụng nó thì đối tượng vẫn còn đó. Bộ thu gom rác có thể di chuyển đối tượng đến vị trí khác bất kỳ lúc nào. Không giống như .NET java không hỗ trợ ghim bộ nhớ. Nếu bạn đang tìm cách đẩy dữ liệu vào một địa chỉ từ mã nguồn gốc thì DirectByteBuffer có thể là những gì bạn cần.

1

Ngoài đề cập đến Unsafe cũng hữu ích ... (tôi đã tự sử dụng nó trong môi trường sản xuất). Có một giải pháp khác sẽ không trả về địa chỉ Java là con trỏ nguyên gốc, nó được gọi là java.nio.ByteBuffer trực tiếp, nó đã được thiết kế với ý tưởng chính xác đó. Nó được cấp phát bộ nhớ bằng ByteBuffer trực tiếp không được cấp phát trong vùng heap java và nó không thuộc đối tượng thu gom rác tiêu chuẩn. Sau đó, tất nhiên, ByteBuffer cung cấp con trỏ trực tiếp qua ByteBuffer.address()

+0

thats không phải những gì tôi cần ở đây, bởi vì tôi không có bất kỳ ý tưởng về các mã đầu vào im nhận được. Nhưng tôi thích ý tưởng này, vì vậy +1; – RanZilber

0

Với mục tiêu của bạn, tôi nghĩ rằng giải pháp duy nhất là JVMTI. Bạn sẽ liên kết một mã định danh duy nhất với từng đối tượng bằng cách sử dụng thao tác {SetTag}. Sau đó, lắng nghe các sự kiện {FieldModification}.

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