最近研究JPDA,具体说是JDI(Java Debug Interface),关于各种EventRequest在处理时的suspend policy的设置不太理解。在JDK6.0给出的example中(%javahome%\demo\jpda\examples.jar),找到如下代码:
/**
* Create the desired event requests, and enable
* them so that we will get events.
* @param excludes Class patterns for which we don't want events
* @param watchFields Do we want to watch assignments to fields
*/
void setEventRequests(boolean watchFields) {
EventRequestManager mgr = vm.eventRequestManager(); // want all exceptions
ExceptionRequest excReq = mgr.createExceptionRequest(null,
true, true);
// suspend so we can step
excReq.setSuspendPolicy(EventRequest.SUSPEND_ALL);
excReq.enable(); MethodEntryRequest menr = mgr.createMethodEntryRequest();
for (int i=0; i<excludes.length; ++i) {
menr.addClassExclusionFilter(excludes[i]);
}
menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
menr.enable(); MethodExitRequest mexr = mgr.createMethodExitRequest();
for (int i=0; i<excludes.length; ++i) {
mexr.addClassExclusionFilter(excludes[i]);
}
mexr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
mexr.enable(); ThreadDeathRequest tdr = mgr.createThreadDeathRequest();
// Make sure we sync on thread death
tdr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
tdr.enable(); if (watchFields) {
ClassPrepareRequest cpr = mgr.createClassPrepareRequest();
for (int i=0; i<excludes.length; ++i) {
cpr.addClassExclusionFilter(excludes[i]);
}
cpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
cpr.enable();
}
}其中各种EventRequest的suspend policy设置不太相同,比如,MethodExitRequest的处理使用的是EventRequest.SUSPEND_NONE,既在处理该事件时不挂起任何其他线程,而其他的一些EventRequest,比如ExceptionRequest的设置就是EventRequest.SUSPEND_ALL,而且根据官方文档,还有一种suspend policy是SUSPEND_EVENT_THREAD,我想知道这些设置是不是和Java语言本身或者JVM的某些特性有关,设置时应该以什么为依据?谢谢各位对JAVA和JAVA虚拟机熟悉的大侠,问题紧急,如有帮助,必有高分相送。
/**
* Create the desired event requests, and enable
* them so that we will get events.
* @param excludes Class patterns for which we don't want events
* @param watchFields Do we want to watch assignments to fields
*/
void setEventRequests(boolean watchFields) {
EventRequestManager mgr = vm.eventRequestManager(); // want all exceptions
ExceptionRequest excReq = mgr.createExceptionRequest(null,
true, true);
// suspend so we can step
excReq.setSuspendPolicy(EventRequest.SUSPEND_ALL);
excReq.enable(); MethodEntryRequest menr = mgr.createMethodEntryRequest();
for (int i=0; i<excludes.length; ++i) {
menr.addClassExclusionFilter(excludes[i]);
}
menr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
menr.enable(); MethodExitRequest mexr = mgr.createMethodExitRequest();
for (int i=0; i<excludes.length; ++i) {
mexr.addClassExclusionFilter(excludes[i]);
}
mexr.setSuspendPolicy(EventRequest.SUSPEND_NONE);
mexr.enable(); ThreadDeathRequest tdr = mgr.createThreadDeathRequest();
// Make sure we sync on thread death
tdr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
tdr.enable(); if (watchFields) {
ClassPrepareRequest cpr = mgr.createClassPrepareRequest();
for (int i=0; i<excludes.length; ++i) {
cpr.addClassExclusionFilter(excludes[i]);
}
cpr.setSuspendPolicy(EventRequest.SUSPEND_ALL);
cpr.enable();
}
}其中各种EventRequest的suspend policy设置不太相同,比如,MethodExitRequest的处理使用的是EventRequest.SUSPEND_NONE,既在处理该事件时不挂起任何其他线程,而其他的一些EventRequest,比如ExceptionRequest的设置就是EventRequest.SUSPEND_ALL,而且根据官方文档,还有一种suspend policy是SUSPEND_EVENT_THREAD,我想知道这些设置是不是和Java语言本身或者JVM的某些特性有关,设置时应该以什么为依据?谢谢各位对JAVA和JAVA虚拟机熟悉的大侠,问题紧急,如有帮助,必有高分相送。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货