(四)内存分配与回收策略

#内存分配与回收策略 #

  1. 一般情况对象分配在新生代的eden区,当eden区没有足够的内存进行分配时,虚拟机将发起一次minor GC(新生代GC)
  2. 大对象直接进入老年代;虚拟机提供了一个参数-XX:pretenureSizeThreshold,当创建的对象大于该阀值,该对象将直接在老年代分配(目的:避免eden区和两个survivor区大量的复制操作);注意:该参数只对serial和parNew虚拟机有用
  3. 长期存活的对象进入老年代;(eden区创建分配的对象,经过第一次Minor GC仍然活着并且survivor区可以容纳,就将复制到survivor区并且对象年龄设定为1,对象在survivor区内没经过Minor GC并且活着,该值就加1,当对象年龄大于-XX:MaxTenuringThreshold设定值(默认为15)时,该对象就将进入老年代
  4. 动态对象年龄判断。虚拟机并不是一味要求满足对象年龄达到MaxTenuringThreshold才进入老年代,如果在survivor区中相同年龄的对象总大小大于其内存的一半,年龄大于或者等于该年龄的对象将直接进入老年代无需等到MaxTenuringThreshold指定的年龄;
  5. 空间分配担保(在Minor GC前,会检查老年代最大可用的连续空间是否大于新生代所有对象的总大小,大于则Minor GC;小于则查看HandlePromotionFailure参数是否允许担保失败,如果不允许,则进行一次Full GC如果允许,继续检查老年代最大可用连续空间是否大于之前历次晋升到老年代对象的平均大小,如果大于则进行Minor GC,否则进行一次FUll GC)

注意:Jdk 6 update24以后HandlePromotionFailure参数不在影响空间分配担保,而是只要当老年代最大连续可用空间大于新生代对象总大小或者历次晋升老年代对象的平均大小就会进行Minor GC,否则进行Full GC;

minor GC与Full GC

Minor gc:指发生在新生代的垃圾收集动作,特点:Minor GC 频繁,回收快
Full GC/Major GC:指发生在老年代的垃圾收集动作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM内存结构: JVM内存分为如下五个部分: 1. 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。每个线程都有一个程序计数器,是线程私有的,生命周期与线程相同。 2. Java虚拟机Java虚拟机栈也是线程私有的,生命周期与线程相同。每个方法执行的时候,JVM都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法调用结束后,相应的栈帧也会被销毁。 3. 本地方法栈 本地方法栈也是线程私有的,它与Java虚拟机栈的作用非常相似,只不过它是为虚拟机使用到的Native方法服务。 4. JavaJava堆是JVM所管理的内存中最大的一块,也是所有线程共享的。Java堆是用于存储对象实例的内存域,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的重点域,也被称为GC堆。 5. 方法 方法也是线程共享的,用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在JDK8之前,永久代(PermGen)是方法的一部分。在JDK8时,永久代被彻底移除,使用了元空间(Metaspace)来代替。 内存分配策略: JVM的内存分配策略主要有以下几种: 1. 对象优先在Eden分配 当JVM需要为新的对象分配内存时,会优先在Eden进行分配。如果Eden没有足够的空间,JVM会通过Minor GC回收部分内存空间。 2. 大对象直接进入老年代 如果要分配的对象大小超过了Eden的一半,JVM会直接将该对象分配到老年代。这样做的目的是为了避免在Eden内产生大量的垃圾对象,从而降低了Minor GC的频率。 3. 长期存活的对象进入老年代 JVM会为每个对象定义一个年龄计数器,当一个对象在Eden经历了一次Minor GC后仍然存活,会被移动到Survivor。在Survivor中,对象会被继续观察,如果其存活时间达到了一定的阈值,就会被晋升到老年代中。这样做的目的是为了保证长期存活的对象能够在老年代中有足够的空间进行分配。 4. 空间分配担保 每次进行Minor GC时,JVM都会检查老年代的可用空间是否足够,如果足够,就可以安全地将所有存活的对象晋升到老年代中。如果不足,JVM会检查这次Minor GC之前的晋升到老年代的对象的平均大小与老年代的剩余空间的比值,如果比值大于某个阈值(通常为50%),那么这次Minor GC就会中止,JVM会进行Full GC来释放一些空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值