运行时数据区-堆(Heap)- 年轻代与老年代

年轻代与老年代

  • 存储咋在JVM中的Java对象可以被划分为两类:
    • 一类是生命周期较短的瞬时对象,这类对象的创建和消亡非常迅速
    • 另一类对象的生命周期确非常长,在某种极端的情况下还能够与JVM生命周期保持一致
  • Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(OldGen)
  • 其中年轻代又可以划分为Eden空间和Survivor0空间和Survivor1空间(有时也叫做from区和to区)
  • 配置新生代于老年代在对结构的占比:
    • 默认-XX: NewRatio=2,表示新生代占1,老年代占2。新生代占整个堆的1/3
    • 也可以修改-XX: NewRatio=4,表示新生代占1,老年代占4。新生代占整个堆的1/5
  • 在HotSpot中,Eden空间和另外两个Survivor空间缺省所占比例是8:1:1
  • 开发人员可以通过JVM参数选项:-XX: SurvivorRatio调整这个空间比例。比如: -XX: SurvivorRatio=8
  • 几乎所有的Java对象都是在Eden区被new出来的
  • 绝大多部分的对象的销毁都是在新生代中进行的
  • 可以使用-Xmn设置新生代最大内存大小

 

对象分配过程:概述

为新对象分配内存是一件非常严谨和麻烦的事情,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法和内存回收算法密切相关,所以还需要GC执行完内存回收之后是否在内存空间产生碎片

  1. new的对象先放在伊甸园区,此区域有大小限制
  2. 当伊甸园空间填满时,程序又需要创建对象,JVM垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园中的不在被其他对象引用的对象进项销毁。再加载新的对象放到伊甸园
  3. 然后将伊甸园中的剩余的对象移动的幸存者0区
  4. 如果再次出发GC,此时上次幸存下来的放到幸存者0区的,没有被回收的对象就会被移动到幸存者1区
  5. 如果再次经历垃圾回收,此时会重新放回幸存者和0区,接着这次去幸存者1区
  6. 啥时候能去养老区?可以设置次数,默认是:15此
    1. 可以设置参数:-XX:MaxTenuringThreshold=<N>进行设置

 

总结

  • 针对幸存者S0和S1区的总结:复制之后有交换,谁空谁是To
  • 关于垃圾回收:频繁在新生代收集,很少在养老区收集,几乎不在永久代(元空间)收集

 

 

 

`MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory` 这段错误信息通常出现在使用基于标记-整理算法 (MarkCompactCollector) 的垃圾回收机制的环境中,例如一些 Java 应用程序或者 Node.js 环境下运行的 JavaScript 代码中。 ### 分解错误信息含义: #### `MarkCompactCollector` 这是一个垃圾收集器(garbage collector),用于管理内存分配和回收过程。在某些 Java 虚拟机实现中,比如 OpenJDK,它负责处理年轻代(Young Generation)的对象管理和年代Old Generation)之间的对象晋升(Promotion)过程。当对象从年轻代晋升到年代时,如果年代空间不足,可能会触发更复杂的过程来解决内存不足的问题。 #### `young object promotion failed` 这表示尝试将对象从年轻代移动到代的过程中失败了。这种失败通常是由于年轻代的可用空间不足以容纳那些需要晋升的年对象,或者是年轻代中的特定域已经耗尽了内存空间。这样的情况可能导致应用性能下降甚至崩溃,因为内存分配不再能够满足应用程序的需求。 #### `Allocation failed - JavaScript heap out of memory` 这是针对 JavaScript 引擎而言的信息,表明 JavaScript Heap)内存已经耗尽,无法完成新的内存分配请求。这通常意味着当前的 JavaScript 对象实例过多、大小过大,或者频繁地创建和销毁对象导致垃圾回收压力增大,最终导致内存溢出。 ### 解决方案: 1. **优化代码**:减少不必要的对象创建和增加,尤其是大型对象的使用,提高代码效率,减少内存占用。 2. **调整内存配置**:对于 Java 应用,可以修改 JVM 参数,如 `-XX:NewRatio=4` 来设置年轻代与代的比例,或者通过 `-Xms` 和 `-Xmx` 设置初始大小和最大大小。对于 Node.js,可以调整 `--max-old-space-size` 参数来限制 JavaScript 的最大容量。 3. **定期垃圾回收**:合理安排垃圾回收策略,避免长时间运行期间内存积累过量。例如,使用更高效的垃圾回收器,如 G1 GC 或者 Shenandoah GC。 4. **资源监控和分析**:使用工具如 VisualVM 或 VisualVM for Windows 监控 Java 应用程序的内存使用情况,并对内存泄漏等异常情况进行诊断。 5. **优化数据结构与算法**:选择更适合应用场景的数据结构和算法,避免无谓的内存消耗。 6. **分批加载和异步处理**:对于大规模数据操作,考虑使用分批次加载和异步任务处理,减轻内存负担。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值