對《java程式設計師上班那點事》筆者對陣列佔用記憶體質疑

y_keven發表於2014-01-22

1.《java程式設計師上班那點事》筆者對陣列佔用記憶體的描述


2.實際測試情況:


    /**
     * 測試一維陣列佔用記憶體
     */
    public static void testOneArray() {
        System.out.println("當前虛擬機器的最大記憶體:" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory() + "byte");
        System.out.println("迴圈前虛擬機器已佔記憶體:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
        try {
            int len = 1024 * 1024 * 300;// 設定迴圈次數
            byte[] buffer = new byte[len];
            for (int i = 0; i < len; i++) {
                buffer[i] = (byte) i;
            }
            System.out.println("迴圈前虛擬機器已佔記憶體:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
        } catch (Error e) {
            System.out.println("遇到錯誤:" + e);
        }
        /*
         * 測試結果:
           當前虛擬機器的最大記憶體:793m------832438272byte 
           迴圈前虛擬機器已佔記憶體:127m====133234688byte 
           迴圈前虛擬機器已佔記憶體:427m====447877120byte
         */
    }

    /**
     * 測試二維陣列佔用記憶體
     */
    public static void testTowArray() {
        System.out.println("當前虛擬機器的最大記憶體:" + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "m------" + Runtime.getRuntime().maxMemory() + "byte");
        System.out.println("迴圈前虛擬機器已佔記憶體:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
        try {
            int len = 1024 * 1024;// 設定迴圈次數
            byte[][] buffer = new byte[len][300];
            for (int i = 0; i < len; i++) {
                buffer[i][0] = (byte) i;
                buffer[i][1] = (byte) i;
            }
            System.out.println("迴圈前虛擬機器已佔記憶體:" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "m====" + Runtime.getRuntime().totalMemory() + "byte");
        } catch (Error e) {
            System.out.println("遇到錯誤:" + e);
        }
        /*
         * 測試結果:
           當前虛擬機器的最大記憶體:793m------832438272byte
          迴圈前虛擬機器已佔記憶體:127m====133234688byte
          迴圈前虛擬機器已佔記憶體:398m====417398784byte
         */
}

分析:個人認為,上面前輩的測試沒有在迴圈直接輸出以下jvm已佔用的記憶體;對比我這次的測試,如果用迴圈之後的減去迴圈之前的佔用的記憶體推翻了那位前輩的理論,正好相反,對於哪一種是正確的,有待大家的考證?!

相關文章