1

ScheduledThreadPoolExecutorが300万の将来のタスクで終わるという問題があります。そのタスクがスケジュールされている場所に移動できるように、どのタイプのタスクを確認しようとしていますが、この画面から情報を取得する方法がわかりません(これらの将来のタスクを右クリックして、メニューでさまざまな選択肢を選択してみました) 。実際のランナブルへのリンクなど、GUIに何かが欠けているようです...

さらに掘り下げる方法について何かアイデアはありますか?

ここに画像の説明を入力してください

4

1 に答える 1

2

いくつかの一般的なもの

ポータブルヒープダンプ(phd、ここのタイプを参照)がある場合、実際のデータ(プリミティブ)が含まれていないため、参照マップ(どのタイプが参照を保持しているか)に基づいてのみ結果を作成できることを知っておく必要があります他のタイプ)。

OQLを試してみることができます。これはSQLに似た言語であり、オブジェクトを照会できます。

一例:

select * from java.lang.String s where s.@retainedHeapSize>10000

これにより、最大10kを超えるすべての文字列が返されます。いくつかの関数を作成することもできます(このようにここに集約します)。

あなたはそれを試してみることができます。

現在の問題は

FutureTaskソース(以下はJDK6)を確認する場合:

public class FutureTask<V> implements RunnableFuture<V> {
    /** Synchronization control for FutureTask */
    private final Sync sync;

...
    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        sync = new Sync(callable);
    }
...

    public FutureTask(Runnable runnable, V result) {
        sync = new Sync(Executors.callable(runnable, result));
    }

実際のRunnableは、Syncオブジェクトによって参照されます。

  private final class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = -7828117401763700385L;

        /** State value representing that task is running */
        private static final int RUNNING   = 1;
        /** State value representing that task ran */
        private static final int RAN       = 2;
        /** State value representing that task was cancelled */
        private static final int CANCELLED = 4;

        /** The underlying callable */
        private final Callable<V> callable;
        /** The result to return from get() */
        private V result;
        /** The exception to throw from get() */
        private Throwable exception;

        /**
         * The thread running task. When nulled after set/cancel, this
         * indicates that the results are accessible.  Must be
         * volatile, to ensure visibility upon completion.
         */
        private volatile Thread runner;

        Sync(Callable<V> callable) {
            this.callable = callable;
        }

したがって、GUIでSyncオブジェクトを開き(画像では開かない)、Runnablesを確認できます。

コードを変更できるかどうかはわかりませんが、一般的には、リークを回避できるため、エグゼキュータが使用するキューのサイズを常に制限することをお勧めします。または、永続化されたキューを使用することもできます。制限を適用する場合、たとえば、拒否、呼び出し元での実行などの拒否ポリシーを定義できます。詳細については、 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.htmlを参照してください。

于 2012-11-18T19:42:49.400 に答える