一段java测试代码所造成的困惑

昨晚写了个测试double和Double占用内存的测试代码,然后出现了意想不到的结果。
java version 是1.8.0
package test;

import org.omg.SendingContext.RunTime;

public class GetUsingBytes {

	public static void main(String[] args){
		
		long count=getBytesUsingPrimitive(100);
		System.out.println("Using double cost:"+count+" bytes");//part 1
		
		long cost=getBytesUsingDouble(100);
		System.out.println("Using Double cost:"+cost+" bytes");//part 2
		
		
	}
	
	
	
	private static long getBytesUsingDouble(int n){
		System.gc();
		long memStart=Runtime.getRuntime().freeMemory();
		Double[][] dd=new Double[n][n];
		
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				dd[i][j]=Math.random();
			}
		}
		
		long memEnd=Runtime.getRuntime().freeMemory();
		return memStart-memEnd;
	}
	
	private static long getBytesUsingPrimitive(int n){
		System.gc();
		long memStart=Runtime.getRuntime().freeMemory();
		double[][] dd=new double[n][n];
		
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				dd[i][j]=Math.random();
			}
		}
		
		
		long memEnd=Runtime.getRuntime().freeMemory();
		return memStart-memEnd;
	}
	
}



输出结果是:
Using double cost:0 bytes
Using Double cost:286888 bytes

我印象中我的第一次输出是有一个数值的,上面的输出结果是我第二次之后的输出结果。
当时看到 Using double cost:0 bytes
一下就懵了,这明显就不可能。
于是我将main函数中的part 1和part 2互换了位置在测试。
package test;

import org.omg.SendingContext.RunTime;

public class GetUsingBytes {

	public static void main(String[] args){
		
		long cost=getBytesUsingDouble(100);
		System.out.println("Using Double cost:"+cost+" bytes");//part 2
		
		long count=getBytesUsingPrimitive(100);
		System.out.println("Using double cost:"+count+" bytes");//part 1
		
		
	}
	
	
	
	private static long getBytesUsingDouble(int n){
		System.gc();
		long memStart=Runtime.getRuntime().freeMemory();
		Double[][] dd=new Double[n][n];
		
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				dd[i][j]=Math.random();
			}
		}
		
		long memEnd=Runtime.getRuntime().freeMemory();
		return memStart-memEnd;
	}
	
	private static long getBytesUsingPrimitive(int n){
		System.gc();
		long memStart=Runtime.getRuntime().freeMemory();
		double[][] dd=new double[n][n];
		
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				dd[i][j]=Math.random();
			}
		}
		
		
		long memEnd=Runtime.getRuntime().freeMemory();
		return memStart-memEnd;
	}
	
}



输出结果:
Using Double cost:183504 bytes
Using double cost:91832 bytes


实在不明白,希望大神指点迷津。

你可能感兴趣的:(java,jvm)