Моя цель - использовать Byteman, чтобы отследить возможную утечку ресурсов, связанную с классом JarInputStream
, но у меня возникают проблемы с его работой в простом тестовом сценарии. (Я пытаюсь заставить правило срабатывать, когда вызывается метод JarInputStream
finalize
, а затем использовать его.)
Вот мой тестовый класс:
package so.example;
import java.io.IOException;
import java.util.jar.JarInputStream;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
new JarInputStream(Main.class.getResourceAsStream("Main.class"));
System.gc();
Thread.sleep(500);
}
}
Это мой скрипт Байтмена:
RULE trace finalize
CLASS ^java.lang.Object
METHOD finalize
IF TRUE
DO System.out.println("Finalizing " + $0)
ENDRULE
Я выполняю так:
java -Dorg.jboss.byteman.transform.all -javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:so.btm,boot:${BYTEMAN_HOME}/lib/byteman.jar so.example.Main
Это вывод, который я получаю, который показывает, что правило запускается для других классов:
Finalizing Socket[addr=null,port=0,localport=0]
Finalizing Socket[addr=null,port=0,localport=0]
Я пробовал и с другими классами, и это сработало. Я также пробовал такие вещи, как создание миллиона JarInputStream
экземпляров и многократный вызов System.gc()
(с более длительным ожиданием), но по какой-то причине я не могу заставить правило сработать для этого класса.