JVM堆内存划分及简单调整

一、内存划分

       java中堆内存用于存储对象的数据,堆内存分为新生代、老年代、永久代(1.8之前)/元空间(1.8之后):
这里写图片描述
       其中新生代用于分配给刚刚产生的对象,老年代则是分配给已经存货很久的对象,或者在新生代中经常被使用的对象(后面解释什么时候会出现这种情况),元空间则是直接使用的是物理内存,比如说32G的内存,分配给java的为24G,则元空间指的是剩下的8G,而新生代和老年代则是位于24G内。1.8之前的永久带也是位于24G内,这是前后的不同之处。GC垃圾回收只处理新生代和老年代中的垃圾,但是并不是说元空间(方法去就不存在GC),方法去也存在有GC。

二、GC流程和空间分配过程

这里写图片描述
如上图所示,当有一个新的对象需要分配空间时,流程如下:

  1. 首先查看Eden区是否有剩余足够的空间,如果存在,对象空间申请成功,如果不足,进行下一步
  2. Eden空间不足时,将会出发MinorGC,JVM回收不活跃对象,回收完成以后,再进行查看当前Eden区是否有充足的空间,有则申请成功,不足则下一步
  3. 当Eden空间不足时,会进一步查看Survivor区是否充足,如果充足,将Eden区部分活跃的对象保存到Survior区,再在Eden区分配空间,如果不足,进行下一步
  4. 当Survior区依然空间不足时,会进一步判断Tenured区(老年代区)是否充足,如果充足,将会将Survior区的部分对象保存到Tenured区,然后将Eden的部分对象保存到Survior区,最后在Eden区分配空间,申请成功,如果Tenured区空间也不充足,则会触发FullGC,再判断,这时候如果还是不满足,则会抛出OOM异常,即内存空间不足的异常(OutOfMemoryError)。

三、堆内存空间调整参数

这里写图片描述
一般将Xms和Xmx值设置成相等可以避免JVM频繁检测内存是否充足以提高性能,此时对应一图内存划分中,将不会存在伸缩区

猜你喜欢

转载自blog.csdn.net/time_travel/article/details/78638874
今日推荐