Java Memory Management and Optimization

垃圾回收机制主要完成下面两件事情:

跟踪并监控每个Java对象,当某个对象处于不可达状态时,回收该对象所占用的内存;

清理内存分配,回收过程中产生的内存碎片。

实际上,垃圾回收机制不可能实时检测到每个Java对象的状态,因此当一个对象失去引用后,它也不会被立即回收,只有等垃圾回收运行时才会被回收。

对于一个垃圾回收器的设计算法来说,大致有如下可供选择的设计。

  1. 串行回收(Serial)和并行回收(Parallel):穿行回收就是不管系统有多少个CPU,始终只用一个CPU来执行垃圾回收操作;而并行回收就是把整个回收工作拆分成多个部分,每个部分由一个CPU负责,从而让多个CPU并行回收。并行回收的执行效率很高,但复杂度增加,另外也有其他一些副作用,比如内存碎片也会增加。
  2. 并发执行(Concurrent)和应用程序停止(Stop-the-world):Stop-the-world的垃圾回收方式在执行垃圾回收的同时会导致应用程序的暂停。并发执行的垃圾回收虽然不会导致应用程序的暂停,但由于并发执行垃圾回收需要解决和应用程序的执行冲突(应用程序可能会在垃圾回收的过程中修改对象),因此并发执行垃圾回收的系统开销比stop-the-world更高,并且需要更多的堆内存。
  3. 压缩和不压缩和复制:为了减小内存碎片,支持压缩的垃圾回收器会把所有的活对象搬迁到一起,然后将之前占用的内存全部回收。不压缩式的垃圾回收器只是回收内存,这样回收回来的内存不可能是连续的,因此将会有较多的内存碎片。较之压缩式的垃圾回收,不压缩式的垃圾回收回收内存块,而分配内存时就会更慢,而且无法解决内存碎片的问题。复制式的垃圾回收会将所有可达对象复制到另一块相同的内存中,这种方式的优点是垃圾回收过程不会产生内存碎片,但缺点也很明显,需要复制数据和额外的内存。

复制:将堆内分成两个相同空间,从根(有向图的起始节点)开始访问每一个关联的柯达对象,将空间A的柯达对象全部复制到空间B,然后一次性回收整个空间A。对于复制算法而言,因为只需访问所有的可达对象,将所有可达对象复制走之后就回收整个空间,完全不用理会那些不可达的对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。

不压缩:标记清除(mark-sweep),垃圾回收器从根开始访问所有柯达对象,将它们标记为可达状态,然后再遍历一次整个内存区域,把所有没有标记为可达的对象进行回收处理。标记清除无需进行大规模的复制操作,而且内存利用率高。但这些算法需要两次遍历堆内存空间,遍历的成本较大,因此造成应用程序暂停的事件随堆空间大小线性增大。而且垃圾回收回来的内存往往是不连续的,因此整理后堆内存里的碎片很多。

压缩:标记压缩(mark-sweep-compact):这种方式充分利用上述两种算法的优点,垃圾回收器先从根开始访问所有可达对象,将它们标记为可达状态。接下来垃圾回收器会将这些活动对象搬迁在一起,这个过程也被称为内存压缩,然后垃圾回收机制再次回收那些不可达对象所占用的内存空间,这样就避免了回收产生的内存碎片。

现行的垃圾回收器用分代的方式来采用不同的回收设计。分代的基本思路是根据对象生存事件的长短,把堆内存分为3个代:

Young;Old;Permanent。

垃圾回收器会根据不同代的特点采用不同的回收算法,从而充分利用各种回收算法的优点。

分代回收的一个依据就是对象生存时间的长短,然后再根据不同代采取不同的垃圾回收策略。采用分代策略基于两个事实:

  1. 绝大多数的对象不会被长时间引用,这些对象在其Young期间就会被回收。
  2. 很老的对象(生存时间很长)和很新的对象(生存时间很短)之间很少存在相互引用的情况。
  1. Young代

对于Young代采用复制算法只需遍历那些处于可达状态的对象,而且这些对象的数量较少,可复制成本也不大,因此可以充分发挥复制算法的优点。Young代由1个Eden区和2个Survivor区构成。绝大多数对象先分配到Eden区中,Survivor区中的对象都至少在Young代中经历过一次垃圾回收,所以这些对象在被转移到Old代之前会先保留在Survivor空间中。同一时间2个Survivor空间中有一个用来保存对象,而另一个是空的,用来在下次垃圾回收时保存Young代中的对象。每次复制就是将Eden和第一个Survivor的可达对象复制到第2个Survivor区,然后清空Eden与第1个Survivor区。Eden与 Survivor的比例通过-XX:SurvivorRatio附加选项来设定,默认为32.如果Survivor太大会产生浪费,太小则会使一些Young代的对象提前进入Old代。

  1. Old代

如果Young代中对象经过数次垃圾回收依然还没有被回收掉,即这个对象经过足够长的时间还处于可达状态,垃圾回收机制就会将这个对象转移到Old代。Old代的空间比Yound代要大很多。

Old代的垃圾回收两个特征:

1.      Old代垃圾回收的执行频率无需太高,因为很少有对象会死掉。

2.      每次对Old代执行垃圾回收需要更长的时间来完成。

基于以上考虑,垃圾回收器通常会使用标记压缩算法。这种算法可以避免复制Old代的大量对象,而且Old代的对象不会很快死亡,回收过程不会大量地产生内存碎片,因此相对比较划算。

  1. Permanent代

Permanent代主要用于装载Class,方法等信息,默认为64M,垃圾回收机制通常不会回收Permanent代中的对象。对于那些需要加载很多类的服务器程序,往往需要加大Permanent代内存,否则可能因为内存不足而导致程序终止。对于像Hibernate,Spring这类喜欢AOP动态生成类的框架,往往会生成大量的动态代理类,因此需要更多的Permanent代内存。如果遇到java.lang.OutOfMemoryError:PermGen space的错误,这就是由Permanent代内存耗尽所导致的错误。

当Young代的内存将要用完的时候,垃圾回收机制会对Young代进行垃圾回收,垃圾回收机制会采用较高的频率对Young代进行扫描和回收。因为这种回收的系统开销比较小,因此也被称为次要回收(MINOR collection)。当Old代的内存将要用完时,垃圾回收机制会进行全回收,也就是对Young代和Old代都要进行回收,此时回收成本就大得多了,因此也称为主要回收(Major Collection)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
《Synopsys Timing Constraints and Optimization User Guide》是一份关于使用Synopsys工具进行时序约束和优化的用户手册。该手册旨在帮助工程师在设计和验证过程中正确地定义和应用时序约束,以满足设计的时序要求,并优化设计的性能。 时序约束是在设计阶段为电路模块中的时序路径设置的规定,以确保电路在不同的操作条件下都能按照预期的时序行为工作。手册中详细介绍了各种类型的时序约束,包括时钟约束、数据路径和组合逻辑约束、I/O约束等,以及如何正确地定义和应用这些约束。通过合理设置时序约束,可以最大限度地提高设计的时序性能和可靠性,并减少电路中的时序违规问题。 另外,手册还介绍了Synopsys工具中的优化技术,帮助工程师通过对电路和时序约束的优化来提高设计的性能。这些优化技术包括时钟树优化、缓冲器和锁相环的优化、时序规划等,通过合理使用这些优化技术,可以降低电路的功耗、提高时序边际,并满足设计的性能要求。 《Synopsys Timing Constraints and Optimization User Guide》的使用者需要具备一定的电路设计和验证基础知识,熟悉Synopsys工具的使用方法。手册中提供了详细的步骤和示例,以帮助工程师正确地使用工具来定义和优化时序约束。 总之,《Synopsys Timing Constraints and Optimization User Guide》是一份对于使用Synopsys工具进行时序约束和优化的有效指导,通过正确地定义和应用时序约束,以及使用优化技术,可以提高设计的时序性能和可靠性,满足设计的要求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值