问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java的垃圾回收机制是否允许程序员指定回收并立即回收不用的内存吗?指定回收就马上能回收吗

发布网友 发布时间:2022-04-23 00:41

我来回答

4个回答

热心网友 时间:2023-10-09 11:22

1. 引用计数器算法
解释
系统给每个对象添加一个引用计数器,每当有一个地方引用这个对象的时候,计数器就加1,当引用失效的时候,计数器就减1,在任何一个时刻计数器为0的对象就是不可能被使用的对象,因为没有任何地方持有这个引用,这时这个对象就被视为内存垃圾,等待被虚拟机回收
优点
客观的说,引用计数器算法,他的实现很简单,判定的效率很高,在大部分情况下这都是相当不错的算法
其实,很多案例中都使用了这种算法,比如 IOS 的Object-C , 微软的COM技术(用于给window开发驱动,.net里面的技术几乎都是建立在COM上的),Python语言等.
缺陷
无法解决循环引用的问题.
这就好像是悬崖边的人采集草药的人, 想要活下去就必须要有一根绳子绑在悬崖上. 如果有两个人, 甲的手拉着悬崖, 乙的手拉着甲, 那么这两个人都能活, 但是, 如果甲的手拉着乙, 乙的手也拉着甲, 虽然这两个人都认为自己被别人拉着, 但是一样会掉下悬崖.
比如说 A对象的一个属性引用B,B对象的一个属性同时引用A A.b = B() B.a = A(); 这个A,B对象的计数器都是1,可是,如果没有其他任何地方引用A,B对象的时候,A,B对象其实在系统中是无法发挥任何作用的,既然无法发挥作用,那就应该被视作内存垃圾予以清理掉,可是因为此时A,B的计数器的值都是1,虚拟机就无法回收A,B对象,这样就会造成内存浪费,这在计算机系统中是不可容忍的.
解决办法
在语言层面处理, 例如Object-C 就使用强弱引用类型来解决问题.强引用计数器加1 ,弱引用不增加
Java中也有强弱引用
2. 可达性分析算法
解释
这种算法通过一系列成为 "GC Roots " 的对象作为起始点,从这些节点开始向下搜索所有走过的路径成为引用链(Reference Chain) , 当一个对象GC Roots没有任何引用链相连(用图论的话来说就是从GC Roots到这个对象不可达),则证明此对象是不可用的
优点
这个算法可以轻松的解决循环引用的问题
大部分的主流java虚拟机使用的都是这种算法
3. Java语言中的GC Roots
在虚拟机栈(其实是栈帧中的本地变量表)中引用的对象
在方法区中的类静态属性引用对象
在方法区中的常量引用的对象
在本地方法栈中JNI(即一般说的Native方法)的引用对象

热心网友 时间:2023-10-09 11:23

java的GC回收是完全自动的,没有提供相关api手动回收,所有的内存分配和回收权限都在jvm,不在开发人员手里

热心网友 时间:2023-10-09 11:23

不能。即使你调用了System.finalize()追问那么垃圾回收机制可以在期望的时间回收不用的内存吗

追答当内存不足的时候系统会主动回收,而你即使调用了方法想去回收内存,系统只会知道哪些对象的内存可以回收,但没人可以确定系统什么时候回收

热心网友 时间:2023-10-09 11:24

不能追问那么垃圾回收机制可以在期望的时间回收不用的内存吗

为什么不能啊,第一个问题

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
爱情的句子高质量文案句子 干妹妹对我"久伴你"是什么意思 陪她一辈子的文案汇总123句 蜂窝移动通信笔记2——调制 通信系统的带宽和频率分析 汽车座椅头枕应该调到什么位置 老面馒头和酵母馒头的区别 老面馒头与酵母馒头哪个好 2024财富中国500强最赚钱40家公司揭晓 2024中国500强盈利排名榜一览 2024全球银行1000强中国名单2024世界银行1000强中国哪些上榜 品牌榜:2024年中国十大银行排行榜 投票结果公布【新】 Delphi New Dispose FreeMem 如何回收管理内存 清理后台程序以回收内存,是否清理?是啥意思 GC.Collect()内存回收问题 Java的内存自动回收真的是优点吗 Java程序员是否应该了解内存回收机制? java的内存回收机制是什么呢?程序员能自己手动释放内存么?能指定内存释放时间么? java关于内存回收的说明 java什么情况会进行内存回收 运行完C语言程序需要把内存回收? java如何进行内存自动释放,垃圾回收 回收内存什么意思 内存释放就是内存回收吗? Java语言的内存回收机制是什么 java的内存回收既可以由系统完成也可以由程序员完成吗? java堆内存怎样回收 Java有垃圾回收机制,内存回收程序可在指定的时间释放内存对象 c语言内存怎么回收和代码是什么? 苹果7p能用iPad充电器实现快充么 内存回收程序允许程序员直接释放内存 小米max3充电多久 - 信息提示 如何恢复uc浏览器删除的缓存视频? 我在UC浏览器下载的视频让我不小心误删了,怎么样可以找回,感谢,拜 在uc浏览器上缓存的视频怎么恢复? 我一不小心,从UC上误删除手机里的视频怎么办 UC浏览器删除了历史记录怎么才能找回呢 在uc浏览器删除了手机拍摄的视频源文件可以恢复吗? 在uc浏览器下载视频后被删除掉,现在想看,还找的回来吗? UC浏览器里下载管理VideoData目录下的文件删除了之后下载的视频就不能看了,这还能找回文件 ? 在uc浏览器内,删除本地视频怎么办。之前删除只是删除记录,现在可以直接删除手机内存的东西,恢复? 手机uc浏览器的缓存视频怎么恢复??有什么软件吗 在健身房如何训练可以提高弹跳能力? 怎么在健身房里练弹跳, 健身房怎么练弹跳和腿部力量 面包松软有弹性秘诀 在健身房里怎么练弹跳? 有哪些技巧可以让面包更松软? 健身房怎样增加弹跳 怎样使做出的面包更松软? 如何在健身房里练习弹跳