- Given a java program, where we are allocating memory in heap store.
- We will allocate array (array of long primitives).
- We will analyze (or calculate) the memory consumption of JVM heap store.
- We will use java runtime to get JVM total memory, free memory and used memory.
1. Program flow to analyze total memory, free & used memory.
- Calculate total memory, used memory & free memory using java runtime.
- Allocate array of longs.
- We have allocate big enough buffer, so that we can easily make out the difference in memory consumption.
- Again calculate total memory, used memory & free memory using java runtime.
- Used memory should be increased.
- Allocate array of integers.
- Perform step 1 again.
- Used memory will increase.
- Clean up the both arrays (Step 2 & Step 4) and request GC to collect the memory.
- Perform Step 1,
2. Get total memory, free memory & used memory in java (JVM heap store).
package org.learn;
public class JVMHeapStore {
public static void main(String[] args) {
long totalMemory ;
long freeMemory;
long usedMemory;
int MB = 1024 *1024 ;
Runtime runtime = Runtime.getRuntime();
runtime.gc();
totalMemory = runtime.totalMemory() / MB;
freeMemory = runtime.freeMemory() / MB;
usedMemory = totalMemory - freeMemory;
System.out.printf("1. Total memory=%dMB, Free memory=%dMB, Used memory=%dMB\n",
totalMemory,freeMemory,usedMemory);
System.out.println("2. Allocating space for 1000000 longs");
long[] arrLong = new long[1000000];
for(int index = 0; index < arrLong.length;index++) {
arrLong[index] = index;
}
totalMemory = runtime.totalMemory() / MB;
freeMemory = runtime.freeMemory() / MB;
usedMemory = totalMemory - freeMemory;
System.out.printf("3. Total memory=%dMB, Free memory=%dMB, Used memory=%dMB",
totalMemory,freeMemory,usedMemory);
System.out.println("\n4. Allocating space for another 1000000 longs");
long[] anotherLongArray = new long[1000000];
for(int index = 0; index < anotherLongArray.length;index++) {
anotherLongArray[index] = index;
}
totalMemory = runtime.totalMemory() / MB;
freeMemory = runtime.freeMemory() / MB;
usedMemory = totalMemory - freeMemory;
System.out.printf("5. Total memory=%dMB, Free memory=%dMB, Used memory=%dMB",
totalMemory,freeMemory,usedMemory);
System.out.println("\n6. Invalidate array's memory & request GC to collect");
//clean up both arrays
anotherLongArray = null;
arrLong = null;
//Run gc collect
runtime.gc();
totalMemory = runtime.totalMemory() / MB;
freeMemory = runtime.freeMemory() / MB;
usedMemory = totalMemory - freeMemory;
System.out.printf("7. Total memory=%dMB, Free memory=%dMB, Used memory=%dMB",
totalMemory,freeMemory,usedMemory);
}
}
Output: total memory, free & used memory of java application (JVM).
1. Total memory=241MB, Free memory=241MB, Used memory=0MB
2. Allocating space for 1000000 longs
3. Total memory=241MB, Free memory=229MB, Used memory=12MB
4. Allocating space for another 1000000 longs
5. Total memory=241MB, Free memory=222MB, Used memory=19MB
6. Invalidate array's memory & request GC to collect
7. Total memory=241MB, Free memory=241MB, Used memory=0MB