我的目标是使用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);
}
}
这是我的Byteman脚本:
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]
我也尝试了其他类,并且奏效了。我还尝试过创建100万个JarInputStream
实例,并多次调用System.gc()
(等待时间更长)的方法,但是由于某种原因,我无法为该类触发规则。>