引言

对于大多数Java应用来说,Java Heap(Java堆)是JVM管理的内存中较大的一块,而且Java Heap是被所有线程共享的一块内存区域,于虚拟机启动时创建。

而Java堆的唯一目的就是存放对象实例。

由于Java堆是垃圾收集器管理的主要区域,因此也被称为"GC堆"。

再从内存回收的角度来看,由于现代收集器基本都采用分代收集算法,所以Java Heap还可以被细分为:

新生代和老年代,新生代再分得细致一点就可以分为Eden空间和两个相同大小相同的Survivor空间,下面来谈谈新生代和老年代。

新生代

先上一张图(图是盗的,来自https://blog.csdn.net/sted_zxz/article/details/72476673)

通俗理解就是新创建的对象就是先进入新生代,然后创建久而且还未被回收的对象自然而然就进入老年代。

上面说了,年轻代又分为一个Eden空间和两个Survivor空间,这样分的意义是什么呢,这里不得不说一下一个垃圾收集算法:

复制算法:

这里不得不又介绍一下

传统的标记清除算法:就是首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

该算法有如下缺点:
   1.效率问题
   2.空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前出发另一次垃圾收集动作。

(图是截书上的,应该看得清吧)

所以复制算法就是主要为了解决以上的缺点,复制算法就是将可用内存按容量划分为大小相等两块,每次只使用其中的一块,

当这一块的内存用完了,就将还存活着的对象复制道另外一块上面,然后再把已使用过的内存空间一次清理掉,这样每次都是对整个半区进行内存回收,所以内存分配时也就不用去考虑内存碎片等复杂情况了,但是这种算法也有一个很明显的缺点,会缩小实际可以使用的内存,这里就直接缩小了一半!

而其实年轻代这样分配Eden和两个两个Survivor其实就是采用了复制算法的思想,不过这就没有每次都只使用一次这么夸张,这里年轻代每次都只使用Eden和一个Survivor,即新创建的对象都放入Eden和一个Survivor,如果内存不够,就会先把这两个空间上还存活的对象放入另一个Survivor空间,然后进行Minor GC。

而新生代为什么要采用这种算法呢,这是因为新生代的对象大部分都是“朝生夕死”,因此这里虽然采用了复制算法的思想,但是并不需要按1:1来划分空间,而只需要分配一小部分空间给Survivor即可,HotSpot虚拟机默认Eden和Survivor比例是8:1 ,即每次新生代可用内存空间为90%,当然如果在这种情况下由超过10%的对象存活(因为这里一个Survivor空间只有10%),即进行过一次Minor GC之后,一个Survivor空间装不下存活的对象,这就需要老年代进行分配担保了。

设置新生代空间:

1.直接对新生代大小进行设置  -Xmn   例如:-Xmn10M   新生代大小为10M(eden+ 2 survivor space)

2.通过设置老年代与新生代的比例来设定  -XX:NewRatio 例如:-XX:NewRatio=4

(表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5,Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置)

设置Eden与Survivor的比例:-XX:SurvivorRatio 例如:-XX:SurvivorRatio=8

(则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10)

老年代

上面说过经过Minor GC之后,如果Survivor存放不下存活的对象,对象就会通过分配担保机制进入老年代,而如果老年代空间还不够,就会进行Full GC。

老年代使用的回收算法是标记整理算法:

该算法也有标记过程,和标记清除算法一样,但是后面不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存:

进入老年代除了以上那种情况还有以下情况:

1.大对象直接进入老年代

大对象是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组,
经常出现大对象容易导致内存还有不少空间时就提前出发垃圾收集以获取足够的连续空间来安置它们。

虚拟机提供了 -XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配,
目的是避免在Eden区以及两个Survivor区之间发生大量的内存赋值(新生代采用复制算法收集内存)

2.长期存活的对象即将进入老年代

虚拟机给每个对象定义了一个对象年龄计数器,如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移动道Survivor空间,并且对象年龄设为1,并且每经过一次Minor GC,就会多一岁,当达到一定值时,就会被移动道老年代(默认为15),可以通过设置-XX:MaxTenuringThreshold设置。

3.动态对象年龄绑定

如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

JVM内存中的年轻代,老年代相关推荐

  1. jvm中的年轻代 老年代 持久代 gc ----------转载

    jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...

  2. java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  3. jvm中的年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  4. JVM笔记-13运行时数据区-堆(OOM、年轻代老年代)

    学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢. 尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) OOM 异常是什么? 堆空间溢出,存放数据大于堆空间大小. packa ...

  5. GC 年轻代 老年代 持久代

    转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Gener ...

  6. java年轻代频繁gc_JVM 年轻代 老年代 持久代 gc

    虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...

  7. Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

    1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...

  8. JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  9. Java中的新生代、老年代和永久代

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

最新文章

  1. mysql高可用之MMM
  2. Python爬虫(八)_正则表达式
  3. opencv4.4.0函数手册_实战 MySQL8.0 窗口函数的巧妙应用
  4. mysql一次更新内容大于4M时报错修改max_allowed_packet变量
  5. 步进电机为什么无法高速启动?
  6. div常用效果方法-transform
  7. vs2010 c++项目创建简易教程
  8. linux内核丢弃udp报文,UDP内核丢弃UDP数据包
  9. 初学51单片机--网上教程(51自学网)
  10. 对51job网页招聘信息的简单爬取
  11. TorchScript简介
  12. 迅雷方舟与花瓣:不一样的“瀑布流”
  13. Vue-实现商品放大镜效果
  14. Spring Data JPA 之 @Entity 的常用注解
  15. 三维重建中经常遇到的拓扑学概念的通俗解释
  16. 推荐一个java技术文章公众号
  17. AppScan详细使用教程
  18. MIT Molecular Biology 笔记6 转录的调控
  19. LCD液晶屏怎么安装
  20. 【大学物理实验】弦振动的研究

热门文章

  1. 浙江商人的23条做人原则
  2. 对于电影《八佰》,知乎与豆瓣的评价相差巨大?分析下电影评论
  3. W51 - 999、电影评价数据的采集
  4. 海关数据:外贸主动营销工具有哪些?
  5. arcgis中的标注和注记
  6. 结构(structure)创建——直接赋值法与使用struct函数创建法。
  7. R语言基础题及答案(一)——数组、数据框、list列表的创建及部分基础问题
  8. U盘硬件设备怎么连接计算机,电脑无法识别u盘设备怎么解决?电脑怎么样才能识别u盘设备...
  9. 这竟然不是阿汤哥?这个「真的吓人」视频火爆全网
  10. 腾讯云增强型SSD云硬盘性能方面有哪些特点?