可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I was trying to see usage of Runtime.freeMemory().
Documentation says it 'Returns the amount of free memory in the Java Virtual Machine'
I executed a simple program test this. Program below:
public class Test { public static void main(String a[]) throws Exception { System.out.println("Total memory: " +Runtime.getRuntime().totalMemory()); System.out.println("Free memory: " +Runtime.getRuntime().freeMemory()); Integer intArr[]= new Integer[10000]; for(int i =0; i<10000;i++){ intArr[i] = new Integer(i+500); } System.out.println("Free memory: " +Runtime.getRuntime().freeMemory()); System.out.println("sample print :"+ intArr[0]); System.out.println("sample print :"+ intArr[5000]); System.out.println("sample print :"+ intArr[9999]); } }
Output:
Total memory: 67108864
Free memory: 61822408 < Before allocating 10000 objects>
Free memory: 61822408 < Size remains same even after allocating 10000 objects. why?>
sample print :500
sample print :5500
sample print :10499
Since the objects are created on heap, the 'Free memory' value printed second time should be less than the first output, right?
But it prints same value. Can anyone please explain why it print same value?
回答1:
I know it is not the answer you wanted - but according to the JavaDoc - freeMemory returns:
an approximation to the total amount of memory currently available for future allocated objects, measured in bytes.
Just to test it - I took your code and ran twice. Once with the array size set to 10,000 - and once with 100. I also added another print just after:
Integer intArr[]= new Integer[10000];
When running with 10,000 - I got the expected result, a decrease of 40,0016 bytes in free memory just after the array instantiation.
When running with 100 I got the exact same amount of free memory before and after array instantiation - not the desired effect.
As most answers already stated - as it is a native method - is JVM dependent and therefore can act differently on any platform. I'm running on Windows 7 with the Eclipse built-in JVM (v3.6).
But I think the key word here is - approximation.
回答2:
Memory is allocated from the surrounding operating system in large chunks. The 10000 objects combined are not large enough to cause an additional allocation.
回答3:
Just checked bytecode.. the fragment is the following, and it is in the middle of the two printf:
SIPUSH 10000 ANEWARRAY java/lang/Integer ASTORE 1
So it does actually allocate the array dinamically, and freeMemory should return a different value. Since it doesn't do so, I guess it is really platform/version dependent like it has already been pointed out.
For example, on my machine it actually changes:
Free memory: 81915960 Free memory: 81353824
Just another guess: maybe it depends on the initial heap size parameter of the JVM, so that if the JVM starts with enough heap already ready to be used it doesn't need to allocate it before a certain threshold (it is the -Xms setting, you could trying increasing or decreasing it to see if something changes).