Używam ASM do monitorowania tworzenia obiektów w Javie. Obecnie biorę wezwanie do init, jako wskaźnik tworzenia nowego obiektu i instrumentu program zTworzenie obiektów monitora za pomocą ASM w Javie
invoke XXX.init
do
dup;
invoke XXX.init;
call_my_method(Object)
Mój pomysł jest do powielania kopii newObjectReference i , po obiekcie init nazywam moją metodę zachowania tego obiektu.
Jednakże, w czasie pracy, jest wyjątek:
java.lang.VerifyError, Expecting to find unitialized object on stack.
Kiedy stosowany wariant "-noverify" w czasie pracy, jeżeli jest przykład gwintu, drugi wyjątek ze sterty
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at test.ThreadTest.test
Dla drugiego przypadku, jestem pewien, że nie ma połączenia z start() wątku z wyjątkiem tego w oryginalnym programie.
Czy istnieje lepszy sposób monitorowania tworzenia nowego obiektu?
Wielkie dzięki.
Zakładam, że nie można używać profilera pamięci do monitorowania przydziałów. Po uzyskaniu tych danych potrzebny jest również sposób ich wizualizacji. na przykład http://www.yourkit.com/docs/11/help/allocations.jsp –
czy możesz podać dokładną instrukcję kodu bajtowego, której używasz dla 'call_my_method (Object)'? – vijay
Dziękuję za uwagi. Popełniłem błąd. Przyjąłem, że jedynym argumentem 'init' jest nowo utworzony obiekt, więc użycie 'dup' może odwiedzić ten obiekt po 'init'. Jednak odkryłem, że tuż przed "init" może istnieć jakiś inny obiekt, który jest argumentem używanym do "zainicjowania" nowo utworzonego obiektu. Dlatego mam powyżej dwóch wyjątków.Można to sprawdzić w kodzie bajtowym "wątek t = nowy wątek (nowy ARunnableClass())" lub inne podobne metody tworzenia obiektów. Muszę znaleźć alternatywne sposoby monitorowania tworzenia obiektu. –