JVM之Java堆
先看图,搞清楚堆在运行区的位置
图片来自网络
介绍
Java堆是JVM所管理内存中最大的一块,存放几乎所有对象实例(例外:栈上分配等)。这块是线程共享的区域。
垃圾回收器管理的主要区域,现代的收集器基本都采用分代收集算法,所以可划分为新生代与老年代,新生代可进一步划分为Eden区、From Survivor区(S0)、To Survivor区(S1)。
可以处于物理上不连续内存空间中,所以标记-清理算法才会起作用。
这个区域一些参数的解释
新生代与老年代的比例可以通过参数-XX:NewRatio来设置。比如,设置-XX:NewRatio=3,表示新生代:老年代=1:3,也就是说老年代占3/4。
Eden区、From Survivor区(S0)、To Survivor区(S1)之间的初始比例是8:1:1,通过-XX:SurvivorRatio参数来设置。比如:-XX:SurvivorRatio=8,表示两个Survivor:Eden = 2:8 ,每个Survivor占 1/10
其他一些参数
- -Xms:设置堆内存最小值
- -Xmx:设置堆内存最大值
- -Xmn堆中新生代初始及最大大小(NewSize和MaxNewSize为其细化)
- -XX:NewSize设置新生代最小空间大小
- -XX:MaxNewSize设置新生代最大空间大小
- -XX:PermSize设置永久代最小空间大小
- -XX:MaxPermSize设置永久代最大空间大小
- -Xss设置每个线程的堆栈大小
是不是参数太多,不容易记,这里有个记忆的小技巧
Xmx(memory maximum), Xms(memory startup), Xmn(memory nursery/new), Xss(stack size)
对于参数的格式可以这样理解
- -: 标准VM选项,VM规范的选项。
- -X: 非标准VM选项,不保证所有VM支持。
- -XX: 高级选项,高级特性,但属于不稳定的选项。
会触发的异常
OutOfMemoryError,堆中没有内存完成实例分配,并堆也无法再扩展时会触发。