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
不足之处欢迎大家留言指正:)