1.堆的细分内存结构
-
JDK 7以前: 新生区+养老区+永久区
- Young Generation Space:又被分为Eden区和Survior区 Young/New
- Tenure generation Space: Old/Tenure
- Permanent Space: Perm
-
JDK 8以后: 新生区+养老区+元空间
- Young Generation Space:又被分为Eden区和Survior区 Young/New
- Tenure generation Space: Old/Tenure
- Meta Space: Meta
2.设置堆内存大小与OOM
public class HeapSpaceInitial {
public static void main(String[] args) {
//返回Java虚拟机中的堆内存总量
long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
//返回Java虚拟机试图使用的最大堆内存量
long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
System.out.println("-Xms : " + initialMemory + "M");//-Xms : 245M
System.out.println("-Xmx : " + maxMemory + "M");//-Xmx : 3641M
System.out.println("系统内存大小为:" + initialMemory * 64.0 / 1024 + "G");//系统内存大小为:15.3125G
System.out.println("系统内存大小为:" + maxMemory * 4.0 / 1024 + "G");//系统内存大小为:14.22265625G
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
设置堆大小为600m,打印出的结果为575m,这是因为幸存者区S0和S1各占据了25m,但是他们始终有一个是空的,存放对象的是伊甸园区和一个幸存者区
3.年轻代与老年代
配置新生代与老年代在堆结构的占比
-
默认-XX:NewRatio=2,表示新生代占1,老年代占2,新生代占整个堆的1/3
-
可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5
-
在hotSpot中,Eden空间和另外两个Survivor空间缺省所占的比例是8:1:1(测试的时候是6:1:1),开发人员可以通过选项 -XX:SurvivorRatio 调整空间比例,如-XX:SurvivorRatio=8
-
几乎所有的Java对象都是在Eden区被new出来的
-
绝大部分的Java对象都销毁在新生代了(IBM公司的专门研究表明,新生代80%的对象都是“朝生夕死”的)