gwt アプリケーションがあります。サーバーの日付をクライアント側に頻繁に表示する必要があります。このために、GWTEventServiceを使用しました。ユーザーがアプリケーションにログインしている間、1 つの rpc を送信し、クライアントに定期的にイベントを送信する 1 つのタイマーを作成します。
しかし、メモリ リークが原因で、JProfiler を使用してデバッグした後、timer 内で作成された日付オブジェクトがスレッドの作成のためにガベージ コレクションされていないことがわかりました。
また、デバッグ モードでスレッドを増やすイメージを 1 つ添付しました。
1)スレッド内で作成されたオブジェクトをガベージコレクションの対象にするにはどうすればよいですか?
2)サーバー時間をクライアントに送信する他の方法は何ですか?
3) JProfiler を使用して GWT War をテストするにはどうすればよいですか?
ハンドラー コード:
public class UtilityCallerActionHandler extends RemoteEventServiceServlet implements
ActionHandler<UtilityCaller, UtilityCallerResult> {
private static Timer myEventGeneratorTimer;
@Inject
public UtilityCallerActionHandler() {
}
@Override
public UtilityCallerResult execute(UtilityCaller action,
ExecutionContext context) throws ActionException {
try{
if(myEventGeneratorTimer == null) {
myEventGeneratorTimer = new Timer(true);
myEventGeneratorTimer.schedule(new ServerTimerTask(), 0, 10000);
}
return new UtilityCallerResult();
}catch (Exception e) {
CommonUtil.printStackTrace(e);
long exceptionBeanId = 0l;
if (e instanceof NTException) {
exceptionBeanId = ((NTException)e).getExceptionBeanId();
}
throw new NTActionException(NTException.getStackTrace(e),e.getCause(), exceptionBeanId);
}
}
@Override
public void undo(UtilityCaller action, UtilityCallerResult result,
ExecutionContext context) throws ActionException {
}
@Override
public Class<UtilityCaller> getActionType() {
return UtilityCaller.class;
}
private class ServerTimerTask extends TimerTask
{
public void run() {
final Date theEventMessage = new Date();
//create the event
Event theEvent = new NTTimerEvent(theEventMessage);
//add the event, so clients can receive it
addEvent(NTTimerEvent.SERVER_MESSAGE_DOMAIN, theEvent);
}
}
}