1

以下の実装を使用して、Java オブジェクトのメモリ消費をテストします。
ただし、呼び出し元のメソッドの for ループで i 制限が 384 から 1694 の場合、使用法が104936 Bとして出力されます。上記の i 制限が 384 未満の場合、
使用状況を0Bとして出力します。

どうしてこれなの?

  • IDE : 日食ケプラー
  • java : 1.5 (これは、Java バージョンも変更された場合に異なる動作をします)
  • OS: Ubuntu 12.10

    public static void main(String[] args) {
    
        Runtime runtime     = Runtime.getRuntime();
    
        long totalStart     = runtime.totalMemory();
        long start          = runtime.freeMemory();
    
        SampleTester sampleTester = new SampleTester();
        sampleTester.callingMethod();
    
        long totalEnd       = runtime.totalMemory();
        long end            = runtime.freeMemory();
    
        System.out.println("Usage [(("+totalEnd+"-"+end+") - ("+totalStart+"-"+start+"))] \t: " + ((totalEnd-end) - (totalStart-start)));
    
    }
    
    private void callingMethod(){
    
        for(int i = 0;  i < 1694; i++){
    
            ArrayList<String> arrayList = new ArrayList<String>();
    
        }
    }
    
4

1 に答える 1

4

ArrayList作成したそれぞれは、現在のループ反復が終了するとすぐに GC の対象になります。

したがって、理論的には、JVM はArrayList、最後の反復の 1 つによって以前占有されていたスペースにそれぞれを割り当てることができ、最後の反復が終了してメソッドが存在するときに破棄される「スロット」を 1 つだけ必要とします。

それが「0」値を説明しています(これまたは同様の最適化)。

実際には、JVM は常にそうするとは限りませんが、パフォーマンスを向上させるために、適格なオブジェクトをしばらく収集しないままにします (GC を頻繁に実行すると、パフォーマンスが低下する可能性があるため)。

JVM が適用する最適化をいつどのように決定するかは完全に実装定義であり、詳細を知ることはほとんど役に立ちません (依存することができず、次のバージョンで変更される可能性があるため)。

そのため、 n ArrayListオブジェクトに必要なメモリ量を知りたい場合 は、現在使用されているメモリを確認するときに、それらのそれぞれが実際に到達可能であり、ガベージ コレクションの対象外であることを確認してください。

于 2013-10-17T12:37:13.283 に答える