jvm的回收机制(老鸟请绕道)

上次我有写到对内存初步的了解,那么这次我将总结我对java自动回收机制的认识与理解。

可以知道java是一门有自动回收机制的语言,但他不是第一门使用回收机制的语言。但是对于平时开发的我们,其实关心回收机制的地方并不多,甚至工作几年的老程序员有一些都不会去深度了解java的回收机制,可以说java的回收机制并不完美,一直处在改进中。

那么我们谈一下为什么要回收?

当计算机分配给java程序一块内存区域后,要知道这块区域是有限的,但是如果程序一直运行,不停的往内存塞东西,内存的大小是远远不够的,因此我们需要对不使用的java对象或者一些引用、常量进行回收(这里我对他们称为已经死亡的对象)。一旦判定他死亡了,那么回收器将对他进行回收。

也许你会问,你怎么知道一个对象死没死?

那么又得说一下判断对象死没死的两种方法:

第一种是计数法,这种方法比较直接,当一个对象出现在内存中,并且被引用,标记唯一,一旦断开引用则直接标记为0,垃圾回收器会对标记为0的对象进行回收。这种方法是存在一定的局限性的。我打个比方,A类内部引用了B类、B类内部引用了A类,此时他两的计数都为1,但是对于我的程序来讲,我已经不再使用A、B了,但是他两还保持引用关系,那么回收器将一直忽视他两。所以说此方法有局限性。

第二种是根搜索方法,对一个对象判定死亡,是从根来搜索,这个‘根’将会连接到每一个存在引用,并且会被使用的对象,因此即使存在使用,但是不在根上面,对象依旧会被判断死亡。也许这样解释很抽象,打个比方,我有一条绳子,和一堆工具(剪刀,钳子,针线什么的),此时他么都系在绳子上,但是当我用完剪刀并且不再使用它,我会把他从绳子上解掉,然后我顺着绳子找不到他了,我就会知道,“哦,我已经不需要绳子了”。

那么判断死亡的方法介绍之后,我们需要来介绍一下回收器是怎么工作的:

虚拟机有一些参数需要设置,但是通常我们都是用默认值,比如内存超过百分之多少,垃圾回收器便会开始工作。垃圾回收器的工作通常分为两步:

第一步是进行扫描,判断对象是否死亡,如果死亡了,那么将对死亡的对象进行标记,注意,只是标记,还并未回收,可以说,这时候对象还没有彻底死亡,还存在着复活的机会,然后回收器会看看是否有finallize()方法,这个方法也许会救回一些对象,取消对他的死亡标记(这里说一下,我么写程序尽量不用用finalize()方法,很影响性能的,具体的以后我会讲到),那么finalize()方法执行完之后,回收器会对具有死亡标记的对象进行回收。

但是物理内存是连续的,但是死亡的对象不一定在物理内存是相邻的,如果这儿死一个,那儿死一个,物理内存都是大大小小一块块分布,是不利于内存优化的,因此设计师们设计的垃圾回收器还分好几种,并且在一个java程序里,一些对象是很久才会死亡,一些对象是朝生夕死的,因此设计们通常都会对他们进行一个初步分类,垃圾回收器对朝生夕死的对象扫描频繁,对很久才会死的扫描次数少一点,欲知详情,请待下回分解。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值