Правило Байтмена не сработало для финализатора JarInputStream - PullRequest
0 голосов
/ 10 сентября 2018

Моя цель - использовать 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() (с более длительным ожиданием), но по какой-то причине я не могу заставить правило сработать для этого класса.

...