热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【JVM】新生代和老年代

堆内存分配:新生代-13Eden区810FromSurvivor110ToSurvivor110老年代-23为什么有From和To,2块区域?因为新生

堆内存分配:

  • 新生代-1/3
    • Eden区 8/10
    • From Survivor 1/10
    • To Survivor 1/10
  • 老年代-2/3

为什么有 From和To,2块区域? 因为新生代的垃圾回收算法:标记-复制算法
把内存区域分为两块,每次使用一块,GC的时候把一块中的内容移动到另一块中,原始内存中的对象就可以被回收了


假如总heap(堆) max分配1200M,那么年轻代占用1/3就是400M,老年代占2/3就是800M。
Eden占年轻代的8/10就是320M。Survivor占年轻代的2/10就是80M,from和to各占40M。

这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

永久代是指的方法区!!!


  • 新生代:主要是用来存放新生的对象
  • 老年代:存放生命周期比较,大小较大的对象
    在这里插入图片描述

新创建的对象都会被分配到Eden区(如果该对象占用内存非常大,则直接分配到老年代区), 当Eden区内存不够的时候就会触发MinorGC(Survivor满不会引发MinorGC,而是将对象移动到老年代中)

1.在Minor GC 开始 的时候,对象只会存在于Eden区和From Survivor区,To Survivor区是空的。Minor GC操作,Eden区如果仍然存活的对象,将会被复制到Survivor To区,并清除内存。而From区中,对象在Survivor区中每熬过一次Minor GC,年龄就会+1岁,当年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认是15)的对象会被移动到年老代中,否则对象会被复制到“To”区。经过这次GC后,Eden区和From区已经被清空。
在发生一次Minor GC后,from区就会和to区互换,原Survivor To成为下一次GC时的Survivor From区。
总结: 在发生Minor GC时,Eden区和Survival From区会把一些仍然存活的对象复制进Survival To区,并清除内存。Survival to区会把一些存活得足够旧的对象移至年老代。总之,GC后,都会保证Survivor To区是空的。

2.随着Minor GC的持续进行,老年代中对象也会持续增长,导致老年代的空间也会不够用,最终会执行Major GC,回收年老代和年轻代中不再被使用的对象资源。

3.当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

4.Full GC是清理整个堆空间—包括年轻代和老年代。什么时候触发:

  1. 调用System.gc

  2. 方法区空间不足

  3. 老年代空间不足,包括:
    新创建的对象都会被分配到Eden区,如果该对象占用内存非常大,则直接分配到老年代区,此时老年代空间不足。
    做Minor GC操作,发现要移动的空间(Eden区、From区向To区复制时,To区的内存空间不足)比老年代剩余空间要,则触发Full GC,而不是Minor GC等等


  • 老年代使用的算法是:(Parallel Old)采用的是标记整理,(CMS)采用的是标记清除
  • 新生代一般使用标记复制

小总结:

  • Minor GC是发生在新生代中的垃圾收集,采用的标记-复制算法;

  • 新生代中每次使用的空间不超过90%,主要用来存放新生的对象;

  • Minor GC每次收集后Eden区和一块Survivor区都被清空;

  • Major GC是发生在老年代中的垃圾收集,采用的标记-清除 / 标记-整理算法


推荐阅读
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 深入浅析JVM垃圾回收机制与收集器概述
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ... [详细]
  • 本文通过对快速排序和堆排序的算法效率进行详细对比分析,探讨了快速排序在实际应用中为何能表现出更高的性能。快速排序通过分治策略实现高效排序,其平均时间复杂度为O(n log n),而堆排序虽然最坏情况下的时间复杂度也是O(n log n),但在实际运行中由于频繁的数据交换和维护堆结构的操作,导致其性能不如快速排序。此外,快速排序在缓存友好性和并行处理方面也具有明显优势,使其在现代计算机架构中表现更为出色。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 如何精通编程语言:全面指南与实用技巧
    如何精通编程语言:全面指南与实用技巧 ... [详细]
  • 深入解析HTTPS:保障Web安全的加密协议
    本文详细探讨了HTTPS协议在保障Web安全中的重要作用。首先分析了HTTP协议的不足之处,包括数据传输过程中的安全性问题和内容加密的缺失。接着介绍了HTTPS如何通过使用公钥和私钥的非对称加密技术以及混合加密机制,确保数据的完整性和机密性。最后强调了HTTPS的安全性和可靠性,为现代网络通信提供了坚实的基础。 ... [详细]
  • 在Java面向对象编程中,内存管理是关键环节之一。Java虚拟机(JVM)的内存结构主要由栈(Stack)、堆(Heap)和方法区(Method Area)组成。其中,栈用于存储方法的执行上下文,每个方法调用时都会创建一个栈帧,用于保存局部变量表、操作数栈等信息。堆则是用于存储对象实例和数组,是垃圾回收的主要区域。方法区则用于存储类的元数据、常量池、静态变量等信息。通过合理管理和优化这些内存区域,可以显著提升程序的性能和稳定性。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
  • 在数据库事务处理中,InnoDB 存储引擎提供了多种隔离级别,其中 READ COMMITTED 和 REPEATABLE READ 是两个常用的选项。本文详细对比了这两种隔离级别的特点和差异,不仅从理论角度分析了它们对“脏读”和“幻读”的处理方式,还结合实际应用场景探讨了它们在并发控制和性能表现上的不同。特别关注了行锁机制在不同隔离级别下的行为,为开发者选择合适的隔离级别提供了参考。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 限时精选:深入解析字节跳动Java程序性能优化全攻略,这才是真正的高手之道
    深入探讨如何通过优化代码质量来显著提升字节跳动Java程序的性能和稳定性。本文将详细介绍性能优化的全过程,包括细致的分析、精准的优化策略以及反复的实验验证,帮助开发者掌握真正的高手之道。 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • 深入解析 JVM 运行时数据区域及指令集
    本文详细探讨了JVM运行时数据区域的结构及其指令集,深入分析了各个内存区域的功能与作用,并对常用指令进行了全面解析,为开发者提供了深入理解JVM工作原理的参考。通过具体示例,本文还展示了如何利用这些知识优化代码性能和调试问题。 ... [详细]
author-avatar
邻居小明
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有