Java

パフォーマンス

Swing のその他の変更

新規クラス - UIDefaults.UIDefaultProxy、および関連するパフォーマンス面での変更

Swing の起動時のパフォーマンスが期待するほど良くない主な理由の 1 つは、コンポーネントが UI の委譲を要求するとすぐに UIManager が Look & Feel をロードするため、すべてのコンポーネントクラスに対応した UI のデフォルトを含むデフォルトテーブルがロードされることにあります。

以前のリリースでは、インスタンスの生成は避けるべきであると誤解されていたため、LazyValue の匿名実装を作成することにより、インスタンスの生成を遅らせていました。 LazyValue は、デフォルトテーブルからの最初の取得時にインスタンスを生成するだけの軽量プロキシとして動作するインタフェースです。

Kestrel でのパフォーマンス分析により、インスタンスの生成が決定的な要因であるとする考えが誤りであることがわかりました。 実際のところ、この領域での遅延およびサイズの増加に圧倒的な影響を与える要素は、クラスローディングです。皮肉なことに、大量の匿名インタフェース実装を作成したとしても、役に立つことはありませんでした。

この問題を解決するための一般的な方法は、UIDefaults.java 内で具体的な LazyValue 実装を定義することです。 UIDefaults.java は、要求されるとリフレクションを使用してプロキシ化されたインスタンスを生成します。このクラスは、UIDefaultProxy と呼ばれます。この結果、たとえば Hello World プログラムでは 1 つのクラスだけがロードされ、90 ほどの他のクラスロードを避けることができます。

以下を参照してください。UIDefaults.UIDefaultProxy

既存の匿名 LazyValue 実装を置き換え、ロードが回避可能なクラスを特定する際に、不正に package private であったクラスおよびアクセス用メソッドがいくつか発見されました。UIDefaultProxy は javax.swing パッケージ内に存在し、その大半は javax.swing.plaf.* パッケージ内で使用されるため、プロキシから使用できるようにするためにこれらのシグニチャーの変更が必要になりました。

以下にそのリストを示します。

javax.swing.plaf.basic.BasicBorders

javax.swing.plaf.metal.MetalBorders javax.swing.plaf.metal.MetalIconFactory

Copyright © 1999 Sun Microsystems, Inc. All Rights Reserved.

コメントの送付先:swing-feedback@java.sun.com。 これは購読リストではありません。
Sun
Java ソフトウェア