2011-01-10 15 views
5

powiedzmy mam tej zmiennej:czy można uzyskać adres na stercie zmiennej w java?

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

i chcę wiedzieć, gdzie var znajduje się na stercie (o adresie, jak 0x08 i tak dalej) i wydrukować adres na zewnątrz.

czy to możliwe?

+0

Jeśli wszystko, co chcesz zrobić, to wydrukować obiekt, jakie korzyści możesz uzyskać, wiedząc, gdzie jest na stercie? Co naprawdę chcesz osiągnąć? – Anon

+0

@Anon: Myślę, że on chce wydrukować adres. –

+0

Pracuję nad programem, który dostaje się jako program wejściowy java, oraz kod instrumentów, który drukuje do pliku informacji o dostępie zmiennym. Jedynym sposobem, jaki mogę ustalić między dwoma polami obiektów tej samej klasy, jest ich adres na stercie. Dlatego potrzebuję adresu na stercie – RanZilber

Odpowiedz

8

pracuję na program, który ją jako wejściowego programu java, i instrumenty kod że drukuje się do pliku informacji o zmiennej dostępu. Tylko jeden sposób, jaki mogę określić między między dwoma obiektami tej samej klasy to ich adres na stercie. Dlatego muszę adres na stercie

Można użyć System.identityHashCode uzyskać pojęcie identyczności. Nie jest doskonały, ale jest całkiem niezły. Jeśli otrzymasz adres sterty obiektu, pamiętaj, że JVM może przesuwać obiekty dookoła (i często robi to, gdy pokoleniowy garbage collector promuje długo żywy obiekt do starszej generacji), więc lokalizacja sterty obiektu nie jest dobre zastępstwo dla tożsamości we wszystkich okolicznościach.

+0

to prawdopodobnie rozwiąże problem OP bardzo dobrze w systemach 32-bitowych. – irreputable

+0

System.identityHashCode jest obecnie oparty na losowym generatorze z każdym z nasion nasion – bestsss

+0

możesz rozwinąć? co daje mi System.idenetityHashCode (var)? Potrzebuję czegoś, co pozwoli mi określić pomiędzy tym samym polem na innym obiekcie tej samej klasy. – RanZilber

3

Można spróbować tego artykułu javaPaper: Address of a Java object

Chodzi o użyciu klasy Unsafe w pakiecie sun.misc aby uzyskać adres.

+0

Absolutnie przerażające. Uwaga * Niebezpieczne * (nazwa została wybrana bez podania przyczyny) i * sun.misc * ("prywatny" pakiet specyficzny dla implementacji). Należy również pamiętać, że jest to adres * logiczny *, a nie * fizyczny *. +1 za ciekawy artykuł. –

+0

+1 za Unsafe, to dobrze. – bestsss

+1

To da ci adres pól wewnątrz obiektu, ale nie sam obiekt. –

1

Nawet jeśli udało ci się uzyskać adres sterty obiektu, nie ma gwarancji, że do czasu, gdy go użyjesz, obiekt nadal tam będzie. Śmieciarz może przenieść obiekt w inne miejsce w dowolnym momencie. W przeciwieństwie do .NET java nie obsługuje przypinania pamięci. Jeśli chcesz przesłać dane do adresu z natywnego kodu, DirectByteBuffer może być tym, czego potrzebujesz.

1

Oprócz wspomnianych Niebezpiecznych, które są dobrze ... przydatne (użyłem go sam w środowisku produkcyjnym). Istnieje inne rozwiązanie, które nie zwróci adresu Java jako wskaźnika macierzystego o nazwie direct java.nio.ByteBuffer, został zaprojektowany z myślą właśnie o tym. Przydzielona pamięć przez bezpośrednie ByteBuffer nie jest przydzielane w stercie java i nie jest przedmiotem standardowego czyszczenia pamięci. Wtedy oczywiście ByteBuffer oferuje bezpośredni wskaźnik poprzez ByteBuffer.address()

+0

To nie jest to, czego potrzebuję tutaj, ponieważ nie mam pojęcia o kod wejściowy im uzyskanie. Ale podoba mi się ten pomysł, więc +1; – RanZilber

0

Biorąc pod uwagę twoje cele, myślę, że jedynym rozwiązaniem jest JVMTI. Powiążesz unikalny identyfikator z każdym obiektem, używając operacji {SetTag}. Następnie sprawdź zdarzenia {FieldModification}.

Powiązane problemy