2012-03-09 27 views
6

Tôi hiện đang xây dựng một đại lý JVMTI riêng cho Java 1.7. Vấn đề là tôi cần lập chỉ mục một số dữ liệu liên quan đến các cá thể đối tượng cụ thể của Java. Vì vậy, câu hỏi của tôi là tôi có thể sử dụng giá trị loại công việc như là một thể hiện của đối tượng ID để lấy dữ liệu được lập chỉ mục của tôi?Cách phân biệt duy nhất đối tượng của Java

Tôi đã tìm bất kỳ thông tin nào về ngữ nghĩa của loại công việc. Nó là một con trỏ trên vị trí bộ nhớ của Object? Đó có phải là địa chỉ con trỏ ngăn xếp không? Đây có phải là địa chỉ cho cấu trúc bên trong của JVM không? Vì vậy, tôi không thể tìm ra nếu giá trị của jobject là duy nhất và không thay đổi dọc theo cuộc sống của đối tượng Java.

Cảm ơn sự giúp đỡ của bạn.

chỉnh sửa

Theo thông số kỹ thuật JNI đã tìm thấy here, jobject có vẻ là một con trỏ trên dụ đối tượng của.

+0

bạn đã làm gì cho đến nay và loại thông tin chính xác bạn đang cố lấy và lập chỉ mục hoặc truy xuất dựa trên những gì bạn đã đạt được là gì? –

+0

Có thể tương tự: http://stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode –

+0

Thực tế, câu hỏi của tôi là về một tác nhân JVMTI được viết bằng C. Tôi muốn sử dụng cá thể của Object làm khóa chính cho mục đích lưu vào bộ nhớ đệm (ví dụ như một bản đồ băm hoặc một cây đỏ-đen). & Hàm GetTag. – Gu0sur20

Trả lời

2

Khi bạn nói "giá trị loại công việc", tôi đoán bạn có nghĩa là giá trị được trả về bởi toString. Nếu bạn nhìn vào tài liệu java Nó nói rằng:

Phương thức toString cho lớp Object trả về một chuỗi bao gồm tên của lớp mà đối tượng là một cá thể, ký tự at-dấu `@ ', và biểu diễn thập lục phân chưa dấu của mã băm của đối tượng. Nói cách khác, phương pháp này trả về một chuỗi tương đương với giá trị của:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Và nếu bạn nhìn vào doc Java cho phương pháp hashCode nó khẳng định:

Bất cứ khi nào nó được gọi về cùng một đối tượng nhiều lần trong khi thực thi một ứng dụng Java, phương thức hashCode phải luôn trả về cùng một số nguyên

và cũng

Nhiều như là hợp lý thực tế, phương thức hashCode được xác định bởi lớp Object trả về các số nguyên riêng biệt cho các đối tượng riêng biệt. (Điều này thường được thực hiện bằng cách chuyển đổi địa chỉ nội bộ của đối tượng vào một số nguyên, nhưng kỹ thuật thực hiện điều này là không cần thiết bởi các ngôn ngữ lập trình JavaTM.)

Cập nhật: Response to comment Ryan: System.identityHashCode sẽ giúp bạn có được bản gốc mã băm ngay cả khi phương thức hashcode bị ghi đè. Tuy nhiên, như bình luận lưu ý nó không thực sự độc đáo.

Vì vậy, tôi đoán câu trả lời cho câu hỏi của bạn là có bất biến và rất có khả năng là duy nhất nhưng bạn nên đọc tài liệu hoặc mã nguồn cho JVM của bạn.

+0

HashCode là duy nhất cho từng đối tượng. Tuy nhiên, nó được cho là bị ghi đè nếu bạn ghi đè bằng, vì vậy nó sẽ giống như bất kỳ đối tượng nào khác tương đương bằng bằng. –

+3

@Ryan Không chắc chắn là ** không ** luôn là duy nhất. Khá rõ ràng như vậy: Bạn sẽ có một thời gian khó khăn để đảm bảo một định danh duy nhất bằng cách sử dụng 32 bit trên hệ thống 64 bit .. – Voo

+0

Ngoài ra hợp đồng bằng/hashcode nói rằng 2 đối tượng bằng nhau có cùng mã băm. Vì vậy, nếu hai đối tượng được ngữ nghĩa bằng nhau, hashcodes của họ nên giống nhau. Hai đối tượng không bằng nhau có thể có cùng mã băm, vì vậy System.identityHashCode (hoặc bất kỳ việc triển khai hashcode nào) không thể đảm bảo tính duy nhất. –

1

Ít nhất là trong HotSpot, jobject thực sự là một con trỏ đến một vị trí đối tượng, nghĩa là nó sẽ cung cấp cho bạn một địa chỉ duy nhất cho mỗi đối tượng, một nửa "danh tính duy nhất và bất biến" mà bạn yêu cầu trong khoảng. Vấn đề là địa chỉ có thể thay đổi trong khi thu thập rác, vì HotSpot có thể di chuyển các đối tượng xung quanh.

Hàm GetTag và SetTag JVMTI sử dụng nội bộ bảng băm từ vị trí đối tượng vào thẻ.HotSpot cập nhật bảng băm này bất cứ khi nào các đối tượng được di chuyển xung quanh, một thứ mà bạn không thể sao chép dễ dàng từ vị trí của một tác nhân JVMTI. Chỉ định các giá trị nhận dạng duy nhất của riêng bạn với các thẻ, như bạn nói bạn đã làm, có lẽ là cách duy nhất để đến đây.

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