`
collegeyuan
  • 浏览: 31443 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JVM 新生代老年代

 
阅读更多

1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

 

2.年轻代中的GC

    HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

<iframe id="iframe_0.08459896309287074" style="margin: 0px; padding: 0px; border-width: initial; border-style: none; width: 829px; height: 345px;" src="data:text/html;charset=utf8,%3Cstyle%3Ebody%7Bmargin:0;padding:0%7D%3C/style%3E%3Cimg%20id=%22img%22%20src=%22http://ifeve.com/wp-content/uploads/2014/07/young_gc.png?_=5556188%22%20style=%22border:none;max-width:867px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.08459896309287074',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no"></iframe>

 

3.一个对象的这一辈子

我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

4.有关年轻代的JVM参数

1)-XX:NewSize和-XX:MaxNewSize

用于设置年轻代的大小,建议设为整个堆大小的1/3或者1/4,两个值设为一样大。

2)-XX:SurvivorRatio

用于设置Eden和其中一个Survivor的比值,这个值也比较重要。

3)-XX:+PrintTenuringDistribution

这个参数用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用于设置晋升到老年代的对象年龄的最小值和最大值,每个对象在坚持过一次Minor GC之后,年龄就加1。

分享到:
评论

相关推荐

    Java新生代老年代的划分及回收算法

    通过调整JVM参数,比如新生代和老年代的比例、Survivor区的大小、MaxTenuringThreshold等,可以优化垃圾回收的性能,减少垃圾回收带来的系统停顿时间,提升应用程序的整体运行效率。此外,合理的内存分配和对象管理...

    JVM内存模型架构图-新生代-老年代-永久代

    JVM内存模型架构图,核心部分包括: GC主要在新生区(伊甸园区)、老年区 新生区(伊甸园区(对象都是在这个区new出来的)、幸存区to、幸存区from:幸存区位置会互相交换,谁空谁是to) 老年区 永久区:存储的是...

    JVM调优与内存管理总结

    JVM内存主要分为新生代、老年代和持久代,每个区域都有其特定的垃圾回收策略。 1. 引用计数法(Reference Counting):这是一种简单的垃圾回收算法,但无法处理循环引用,容易导致内存泄漏。 2. 标记-清除法(Mark...

    jvm paper jvm

    1. 堆(Heap):所有对象都在堆中分配内存,是线程共享的区域,分为新生代和老年代。 2. 新生代(Young Generation):新生代进一步划分为Eden区和两个Survivor区(From空间和To空间)。大部分对象在Eden区创建,...

    JVM工作原理学习笔记

    JVM使用不同算法对堆内存进行垃圾回收,如新生代的复制算法、老年代的标记-整理算法或标记-清除算法。垃圾回收的目标是回收不再使用的对象,以释放内存空间。此外,JVM还提供了垃圾收集器,如Serial、Parallel、CMS...

    JVM常见面试题解析.pdf

    3. 内存分代:JVM堆内存分为新生代、老年代和持久代(现为元空间)。新生代进一步划分为Eden和两个Survivor区(S0和S1),目的是通过复制算法减少GC时的对象移动,避免碎片化。默认情况下,新生代与老年代的比例为1:...

    jvm视频及笔记

    4. **垃圾收集**:JVM如何自动管理内存,理解不同垃圾收集器如Serial、Parallel、CMS、G1等的工作机制,以及新生代和老年代的概念。 5. **类加载器**:系统类加载器、扩展类加载器和应用程序类加载器之间的双亲委派...

    思维导图-详细了解JVM和GC过程

    JVM新生代采用此算法。 - **标记-整理(Mark-Compact)**:标记存活对象,然后将所有存活对象移动到一端,直接清理另一端。老年代常用此算法。 - **分代收集(Generational GC)**:根据对象生命周期特点,将...

    狂神说JVM探究.rar

    - 使用JVM参数进行性能优化,例如-Xms、-Xmx设定堆内存大小,-XX:NewRatio调整新生代与老年代比例。 - 调整GC策略,如选择G1、Parallel GC、CMS等。 7. **类加载器**: - Bootstrap ClassLoader、Extension ...

    monkey老师的jvm 调优

    1. **内存管理**:JVM内存分为堆内存和栈内存,其中堆内存又分为新生代、老年代和永久代(Java 8后改为元空间)。合理的设置各区域大小,如新生代与老年代的比例,可以有效避免垃圾收集频繁触发,提高应用响应速度。...

    JVM调优,GC算法汇总

    JVM调优涉及到许多方面,包括堆大小设置(新生代、老年代)、GC策略选择、元空间大小、栈深度等。调优的目标通常是为了平衡应用的响应速度、内存使用和系统资源的消耗。 - **新生代与老年代的大小调整**:新生代...

    jvm思维导图 .pdf

    堆被分为新生代(Young Generation)和老年代(Tenured Generation),新生代进一步细分为伊甸区(Eden Space)、两个幸存者区(From Space和To Space)。默认情况下,新生代占据堆的1/3,其中伊甸区占新生代的大...

    JVM调优总结(java)

    分代收集是现代JVM的主流策略,它将内存分为新生代和老年代,不同代的对象使用不同的垃圾回收策略。新生代主要处理短暂存活的对象,而老年代则负责长期存活的对象。这种策略能有效减少垃圾回收的暂停时间。 4. **...

    jvm gc

    5. **JVM调优**:通过调整JVM参数,可以控制GC的行为,例如设置堆大小、新生代和老年代的比例、GC策略等。常用的JVM参数有`-Xms`, `-Xmx`, `-Xmn`, `-XX:NewRatio`, `-XX:SurvivorRatio`, `-XX:+UseConcMarkSweepGC`...

    JVM调优实战.doc

    然后,通过对JVM参数的调整,比如改变堆大小、设置垃圾回收器类型、优化新生代和老年代的比例等,来提升系统的性能。 总结来说,JVM调优是提高Java应用性能的关键环节,涉及到对内存分配、垃圾回收策略、对象生命...

    JVM面试题资源

    - **JVM参数设置**:如-Xms、-Xmx设置堆大小,-XX:NewRatio控制新生代与老年代比例。 - **内存泄漏检测**:使用内存分析工具,如MAT (Memory Analyzer Tool)。 - **GC日志分析**:通过-XX:+PrintGC、-XX:+...

    JVM图解-JVM指令-JVM原型图.rar

    - 垃圾收集参数调整,例如设置新生代和老年代的比例,以优化不同应用的内存需求。 - 栈帧优化,如逃逸分析,帮助确定对象是否需要在堆上分配。 6. **JVM调优工具**: - JConsole和VisualVM提供可视化的监控和...

    精简版JVM总结.pdf

    堆被进一步划分为新生代、老年代,如Eden Space、Survivor Space和Tenured Gen。当堆空间不足时,无法分配新的实例,会导致OutOfMemoryError。 5. **方法区(永久代)**:存储虚拟机加载的类信息、常量、静态变量和...

Global site tag (gtag.js) - Google Analytics