Gc机制

1.那些内存需要回收
内存运行时jvm会有一个运行时数据区来管理内存.他包括5大部分:程序计数器,虚拟机栈,本地方法栈,方法区,堆.
而其中程序计数器,虚拟机栈,本地方法栈时每个线程私有的内存空间,随线程而生,随线程而亡,同时,java一般申请有两种:静态内存和动态内存.编译时就能够确定的内存是静态内存,即内存是固定的,系统一次性分配,比如int类型变量;动态内存分配就是在程序执行才知道要分配的存储空间大小,比如java对象的内存空间.列如栈中每一栈帧中分配多少内存基本上在类结构定义下来时就已知了,因此这3个区域的内存分配和回收都是确定的.无需考虑内存回收的问题.
但方法和堆就不同,一个借接口的多个实现类需要的内存可能不一样,我们只有在程序运行期间才会知道会创建那些对象,这部分内存的分配和回收都是动态,gc主要关注的是这部分内存.
2,什么时候回收
在java语言中,比较主流的判定一个对象已死的方法是:可达性分析(reachability analysis)
所有生成的对象都是一个称为”gc roots”根的子树.从gc roots 开始向下搜索.搜索所有经过的路径称为引用链(reference chain),当一个对象到gc roots没有任何引用链可以到达时,就称之为不可达的(不可引用的),也就是可以被gc回收了.
3如何回收
以下几种方法
(1)标记-清除(mark-sweep)
算法和名字一样,分为两个阶段:标记和清除.标记所有需要回收的对象非,然后统一回收.这是最基础的算法,后续的收集算法都是基于这种中算法扩展的
(2)复制(copying)
此算法把内存空间划分为两个相等的区域,每次只使用其中一个区域垃圾回收时,遍历当前使用区域.把正在使用中的对象复制到另外一个区域中.此算法每次只处理正在使用中的对象,因此复制成本较小,同时复制过去以后还能进行相应的内存处理,不会出现”碎片”问题.当然,此算法的缺点也是明显的,就是需要两倍内存空间.
(3)分代收集算法
在java程序运行的过程中,会产生大量的对象,因每个对象所能承担的职责不同所具有的功能不同所以也有着不一样的生命周期,有的对象生命周期较长,比如http请求中的session对象,线程,socket连接等;有的对象生命周期较短,比如string对象,由于其不变类的特性,有的在使用一次后即可回收.
将对象按其生命周期的不同划分成年轻代(young generation,年老代(old generaion)),持久代(permanent generation).其中持久代主要存放的是类信息,所与java对象的回收关系不大,与回收息息相关 的是年轻代和年老代.
年轻代:是所有新对象产生的地方.年轻代被对象填满时,就会执行gc,经过多次gc周期后,仍然存活下来的对象会转移到老年代内存空间.通常这是在年轻代有资格提升到年老代前通过设定年龄阈值来完成的.
年老代:在年轻代中经历了多次回收后仍然没有清楚的对象,就会放在老年代中,可以说他们都是久经沙场而不亡的一代,都是生命周期较长的对象.对于年老代和永久代,就能再采用像年轻代中那样搬移腾挪的回收算法,因为那些对于这些回收战场的老兵来说是小儿科.通常会在老年代内存被占满是将会触发full gc,回收整个内存
持久代:用于存放静态文件,比如java类,方法.持久代对垃圾回收没有显著影响.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值