实验环境:
(1)Java版本以及模式:
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
(2)垃圾回收器为Parrallel Scanvenge收集器 和 Parrallel Old收集器
(3)CPU:Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
1、查看基础内存消耗
public classGCTest {public static voidmain(String[] args){}
}
//使用javac编译并执行java -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 GCTest
// 日志如下:
Heap
PSYoungGen total 9216K, used 1312K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
eden space 8192K, 16% used [0x00000000ff600000,0x00000000ff748228,0x00000000ffe00000)
from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000)
to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000)
ParOldGen total 10240K, used 0K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
object space 10240K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ff600000)
Metaspace used 2538K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 278K, capacity 386K, committed 512K, reserved 1048576K
分析日志可知:eden区基础消耗1312K的内存,其中新生代大小为9216K = 8192 + 1024 K,因为 to 区和 from 区只有其中一个能使用。我并不知道基础消耗到哪里去了?有知道的大神告诉我下。
注意:使用cmd命令行执行,基础内存消耗较低,原先使用idea执行基础内存消耗达到2M。
2、新创建的对象内存大于新生代剩余内存将直接分配到老年代
importsun.misc.Unsafe;importjava.lang.reflect.Field;public classGCTest {private staticUnsafe unsafe;static{try{
Field field= Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe= (Unsafe) field.get(null);
}catch(Exception e) {
e.printStackTrace();
}
}public static long addressOf(Object o) throwsException {
Object[] array= newObject[] { o };long baseOffset = unsafe.arrayBaseOffset(Object[].class);int addressSize =unsafe.addressSize();longobjectAddress;switch(addressSize) {case 4:
objectAddress=unsafe.getInt(array, baseOffset);break;case 8:
objectAddress=unsafe.getLong(array, baseOffset);break;default:throw new Error("unsupport