切入点可以动态地特定于线程吗?

时间:2013-11-21 10:13:48

标签: java multithreading profiling aspects

我希望在特定条件下跟踪所有公共方法调用。但我希望这种跟踪尽可能少地损害整个系统的性能。

我需要一种方法,如何动态切换一个切入点,只为指定的线程执行,这个开启(和关闭)必须从我的代码中动态调用。

即。如果我的Java代码发现某件事发生了,它会为它自己的线程打开一个切入点。此切入点将记录所有公共方法调用,并且在一段时间(或一些拦截次数)之后,切入点将自动关闭。

当然,我可以在“... getCurrentThread()。equals(myMonitoringThread)&&& monitoringEnabled”这样的建议中调用代码,但这意味着将为所有线程的所有公共方法运行建议并始终执行此代码,这肯定会损害整个应用程序的性能。

我想要的是在启用时间内为所选线程隔离性能,并保持其余线程不受影响。

有人知道如何做到这一点的技术吗?

由于 托马斯

1 个答案:

答案 0 :(得分:0)

当你使用方面时,你的类会受到影响:字节码被修改为符合方面(或者在Spring的情况下,你的调用代表一个专用的方面兼容类)。

对于AspectJ,可以在编译期间,编译之后或加载时完成(看看here)。检测类会影响方面的定义方式(例如拦截所有公共方法),这意味着它们在运行时实际上不会受到影响(即使我很确定疯狂的编码器可以发明加载/卸载类mecanism处理,但它会疯了;)。

因此,为了回答您的问题,我认为您无法在运行时以简单的方式完全插入/拔出您的方面(如果只有这样!)。