JAVA性能剖析 JVM内存管理与垃圾回收

本文介绍JVM内存管理的分代策略及其对垃圾回收的影响。年轻代、年老代及持久代各有分工,通过不同策略提高内存利用效率。文章还详细解释了垃圾回收的触发条件。

转自:http://my.oschina.net/leejun2005/blog/124011

内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要。最近进行了系列性能测试培训,对JVM内存管理涉及到的概念重新学习梳理了遍,总结下方便大家共同学习进步。

一、为什么要分代

在程序运行过程当中,会创建大量的对象,这些对象大部分是短周期的对象,小部分是长周期的对象。对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频繁垃圾回收以确保无谓地垃圾扫描检测。为了解决这种矛盾,Sun JVM的内存管理采用分代的策略。

二、如何分代

这里先上传一张模型图:


如图所示,虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

1.年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Survivor Space(命名为A和B)

  • 当对象在堆创建时,将进入年轻代的Eden Space。

  • 垃圾回收器进行垃圾回收时,扫描Eden Space和A Survivor Space,如果对象仍然存活,则复制到B Survivor Space,如果B Survivor Space已经满,则复制到 Old Gen

  • 扫描A Survivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen。

  • 扫描完毕后,JVM将Eden Space和A Survivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和B Survivor Space)。

我们可以看到:Young Gen垃圾回收时,采用将存活对象复制到到空的Survivor Space的方式来确保不存在内存碎片,采用空间换时间的方式来加速内存垃圾回收。
2.年老代(Tenured Gen):年老代主要存放JVM认为比较old的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁(譬如可能几个小时一次)。在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。年老代主要采用压缩的方式来避免内存碎片(将存活对象移动到内存片的一边)。当然,有些垃圾回收器(譬如CMS垃圾回收器)出于效率的原因,可能会不进行压缩。

3.持久代(Perm Gen):持久代主要存放类定义、字节码和常量等很少会变更的信息。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

三、什么情况下触发垃圾回收

由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GCFull GC

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden区能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

&middot; 年老代(Tenured)被写满

&middot; 持久代(Perm)被写满 

&middot; System.gc()被显示调用 

&middot;上一次GC之后Heap的各域分配策略动态变化

简单归纳如下:

普通GC(minor/Scavenge GC):只针对新生代区域的GC。

全局GC(Full GC):针对所有分代区域(新生代、年老代、永久代)的GC。

由于年老代与永久代相对来说GC效果不好,而且二者的内存使用增长速度也慢,因此一般情况下,需要经过好几次普通GC,才会触发一次全局GC

内容概要:本文系统研究了基于监督学习的多模态MRI脑肿瘤分割方法,重点聚焦于利用监督体素的纹理特征实现肿瘤区域的精确识别。文章首先阐述了监督学习的基本原理及多模态MRI在医学影像分析中的独特优势,进而深入探讨了灰度共生矩阵(GLCM)、局部二值模式(LBP)和小波变换等多种纹理特征提取技术。在此基础上,构建了基于传统特征工程的分类器模型以及融合深度学习的混合模型,并通过在公开数据集上的实验验证其分割性能,采用Dice系数、敏感度、特异度等指标进行全面评估。研究还剖析了当前面临的关键挑战,如高质量标注数据稀缺、模型泛化能力受限、可解释性不足以及肿瘤边界模糊等问题,进一步提出了结合半监督学习、多任务学习、模型可解释性增强及多模态信息深度融合等未来发展方向,为提升脑肿瘤自动分割的精度临床实用性提供了系统的理论依据和技术路径。; 适合人群:具备医学图像处理或机器学习基础知识,从事生物医学工程、人工智能辅助诊断、计算机视觉等相关领域的科研人员及研究生。; 使用场景及目标:①掌握多模态MRI脑肿瘤分割中的关键技术流程核心算法;②深入理解监督体素纹理特征在医学图像分割中的具体应用价值;③为研发高精度、强可解释性的自动化脑肿瘤分割系统提供方法参考技术支持。; 阅读建议:建议结合提供的Matlab代码实现同步学习,重点关注纹理特征提取模型构建部分,动手复现实验过程以深化理解,同时重视数据预处理结果评估环节,全面提升科研实践创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值