JVM之Java堆

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,堆中没有内存完成实例分配,并堆也无法再扩展时会触发。

独立博客不易,打赏是最好的鼓励~~