クラス融合
-
2 つ以上のクラスを 1 つのクラスにまとめる"クラス融合"では、コンスタントプールエントリやクラスファイルの情報が共有されるので、Java アプリのサイズは大幅に削減されます。
"2 つの融合可能なクラスを 1 つのクラスにまとめる処理"を繰り返すことで"クラス融合"は実現されます。
※ "クラス融合"によって、Java アプリのサイズは小さくなります。しかし、実行時のメモリは圧縮前よりもたくさん必要になります。実行時にメモリが不足する場合は、クラス融合レベルを下げることで、実行時のエラーを回避できます。
クラス融合可能な条件
- 親クラスとの関係
- メソッドのオーバーライドの関係
- バイトコード中に融合を不可能にするような表現が無い
1. 親クラスとの関係
2 つのクラスを 1 つのクラスに融合できるのは、親クラスとの関係が以下のいずれかの場合です。
- 片方のクラスの親クラスが java.lang.Object である
- 両方の親クラスが同じである
- 片方が他方の親クラスである
2. メソッドのオーバーライドの関係
メソッドのシグニチャ ( メソッド名と引数の型 ) が同じで異なるメソッドの実装を呼び出すクラスは融合できません。
3. バイトコード中に融合を不可能にするような表現が無い
instanceof の対象となるクラスとその子クラスは、他のクラスとの融合で意味が変更される可能性があります。
融合可能な 2 つのクラスに関しては、基本的に一方からもう一方にメソッドやフィールドをコピーする要領で融合できます。
融合された後、元のクラスに含まれるそれぞれのフィールドは、同時に使われないので、型が同じであれば共有可能です。