TimYang在博文《降低应用latency方法谈》 中提到对Java方法进行Profiling,在某些场景更倾向于采用纯Java工具类的方法,比如通过给进程发Signals来实现,以求动态地打开或关闭Profiler。
感觉这个思路不错,以下是一个大致实例:
SignalTest.java
/** * */ package signal; import java.util.Observable; import java.util.Observer; import sun.misc.Signal; import sun.misc.SignalHandler; /** * @author xuanyin * */ public class SignalTest implements Observer { /** * @param args */ public static void main(String[] args) { new SignalTest().go(); } private void go() { try { HandlerTest sh = new HandlerTest(); sh.addObserver(this); sh.handleSignal("HUP"); sh.handleSignal("BUS"); System.out.println("Sleeping for 60 seconds: hit me with signals!"); Thread.sleep(60000); } catch (Throwable x) { x.printStackTrace(); } } /** * */ @Override public void update(Observable arg0, Object arg1) { System.out.println("Received signal: " + arg1); } /** * HandlerTest Class */ class HandlerTest extends Observable implements SignalHandler { @Override public void handle(Signal signal) { setChanged(); notifyObservers(signal); } /** * * @param signalName * @throws IllegalArgumentException */ public void handleSignal(String signalName) throws IllegalArgumentException { try { Signal.handle(new Signal(signalName), this); } catch (IllegalArgumentException x) { throw x; } catch (Throwable x) { throw new IllegalArgumentException("Signal unsupported: "+signalName, x); } } } }
首先运行执行上述程序,然后查看其系统进程号。
如,若是4089,则在终端中执行kill -s BUS 4089
Java程序输出:Received signal: SIGBUS
信号具有平台相关性,不同平台下能使用的信号种类是有差异的。
Linux下支持的信号:
SEGV, ILL, FPE, BUS, SYS, CPU, FSZ, ABRT, INT, TERM, HUP, USR1, USR2, QUIT, BREAK, TRAP, PIPE
Windows下支持的信号:
SEGV, ILL, FPE, ABRT, INT, TERM, BREAK
不足之处欢迎大家留言指正:)