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

java有哪些垃圾回收算法?

发布网友 发布时间:2022-04-23 18:39

我来回答

2个回答

热心网友 时间:2022-04-19 02:57

常用的垃圾回收算法有:
(1).引用计数算法:
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不再被使用的,垃圾收集器将回收该对象使用的内存。
引用计数算法实现简单,效率很高,微软的COM技术、ActionScript、Python等都使用了引用计数算法进行内存管理,但是引用计数算法对于对象之间相互循环引用问题难以解决,因此java并没有使用引用计数算法。
(2).根搜索算法:
通过一系列的名为“GC Root”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何引用链相连时,则该对象不可达,该对象是不可使用的,垃圾收集器将回收其所占的内存。
主流的商用程序语言C#、java和Lisp都使用根搜素算法进行内存管理。
在java语言中,可作为GC Root的对象包括以下几种对象:
a. java虚拟机栈(栈帧中的本地变量表)中的引用的对象。
b.方法区中的类静态属性引用的对象。
c.方法区中的常量引用的对象。
d.本地方法栈中JNI本地方法的引用对象。
java方法区在Sun HotSpot虚拟机中被称为永久代,很多人认为该部分的内存是不用回收的,java虚拟机规范也没有对该部分内存的垃圾收集做规定,但是方法区中的废弃常量和无用的类还是需要回收以保证永久代不会发生内存溢出。
判断废弃常量的方法:如果常量池中的某个常量没有被任何引用所引用,则该常量是废弃常量。
判断无用的类:
(1).该类的所有实例都已经被回收,即java堆中不存在该类的实例对象。
(2).加载该类的类加载器已经被回收。
(3).该类所对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射机制访问该类的方法。
Java中常用的垃圾收集算法:
(1).标记-清除算法:
最基础的垃圾收集算法,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象。
标记-清除算法的缺点有两个:首先,效率问题,标记和清除效率都不高。其次,标记清除之后会产生大量的不连续的内存碎片,空间碎片太多会导致当程序需要为较大对象分配内存时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
(2).复制算法:
将可用内存按容量分成大小相等的两块,每次只使用其中一块,当这块内存使用完了,就将还存活的对象复制到另一块内存上去,然后把使用过的内存空间一次清理掉。这样使得每次都是对其中一块内存进行回收,内存分配时不用考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
复制算法的缺点显而易见,可使用的内存降为原来一半。
(3).标记-整理算法:
标记-整理算法在标记-清除算法基础上做了改进,标记阶段是相同的标记出所有需要回收的对象,在标记完成之后不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,在移动过程中清理掉可回收的对象,这个过程叫做整理。
标记-整理算法相比标记-清除算法的优点是内存被整理以后不会产生大量不连续内存碎片问题。
复制算法在对象存活率高的情况下就要执行较多的复制操作,效率将会变低,而在对象存活率高的情况下使用标记-整理算法效率会大大提高。
(4).分代收集算法:
根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和年老代,当新创建对象时一般在新生代中分配内存空间,当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到年老代内存中,当大对象在新生代中无法找到足够的连续内存时也直接在年老代中创建。

热心网友 时间:2022-04-19 04:15

System.gc是专门回收不用的对象的语法,当然你也可以自己写函数来finalization()你的程序。一般JVM会根据虚拟内存占用率来自动调用gc(garbage collector),有时候即便你调用gc如果内存占用不多回收处理工作也不会调用的,毕竟调用一次也要占用资源。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
华为freebuds4i切歌怎么操作_华为freebuds4i怎么切歌 华为freebuds pro切歌方法_华为freebuds pro怎么切歌 华为耳机怎么切换下一曲 欧美电影,好像是宠物有一个世界,宠物会想办法跟主人的灵魂互换占据 ...的名字,欧洲中世纪,一个王子的继母把他的灵魂和狗的灵魂互换了... 问一部外国电影的名字 剧情记得不大清楚l了 是前几年的片子 灵魂互换的... HUAWEI 华为 AGS2-W09 10.1英寸平板电脑 (香槟金、64GB+4GB、WiFi版... 诛仙3百法和千法差距大吗 微信怎么解除应用授权登录 授权应用删除方法 微信怎么解除应用授权登录授权应用删除方法 java常见gc算法有哪些 数据结构 java开发中常用的排序算法有哪些 java中常用的算法,有哪些?告诉我名字就可以了。越多越好 Java的数组的几种经典算法 如何画眼妆能让眼睛看起来很大? 怎么化眼妆显得眼睛大? 眼睛太小了,怎样化简单的眼妆就能让眼睛显得既大又有神? 怎么化眼妆让眼睛看起来更大 怎样画眼妆让眼睛看起来大 自己是单眼皮,画眼妆总是画不好,怎么才能显得眼睛大些呢? 招聘教师与学校签订了承诺书,三年内不允许报考调离其它岗位,这种情况能辞职_百度问一问 进入学校成为一名教师而且有编制,需要经过哪些程序,办理哪些手续啊?(急) 参考安徽省教师编有一个学员什么应届生保证承诺书这个要通过了还要弄吗 教师招聘报名登记表和诚信承诺书忘记打印了怎么办 教师工作承诺一句话 编外合同制教师的承诺书签后区能去考教招吗? 教师的“七条承诺”是什么 2020年云南楚雄613教师专项招聘网上报名承诺书如何写?有模板吗? 想参加寿光市教师招聘,但是还没有拿到教师资格证,可以用教师资格承诺书吗? 教师招聘 :必须与用人单位签订服务5年以上的承诺协议,是不是在此期间不能考别处的教师或公务员 常用的算法在java里边怎么做,例 大学java中都学过哪些经典算法?请学过的朋友解答下 请给出java几种排序方法 Java中常用的加密算法有哪些 java排序算法有多少种 java常用算法,给个int数组,数字不连续,找出最小空缺数 墙布贴好几天可以打胶 墙纸和门框收口处要打胶吗? 贴完墙纸师傅说墙纸和门窗接缝处要打玻璃胶避免翘边真需要打的话甚么牌子的玻璃胶合适呢谢谢! 墙纸壁布接口爆开,用什么来封,玻璃胶好还是美容胶好? 我想做超市的店长,但是我不知道店长具体做些什么 墙纸收边打胶贴美纹纸行吗 店长职责是什么 家装贴好墙纸墙布后,有没有必要封边 纯纸墙纸打胶上墙后怎么会皱 如何清除墙纸和门框接缝打玻璃胶? 贴墙纸后用玻璃胶封边,好用吗? 我是一家新便利店(超市)的店长 我应该怎么做好工作 墙纸出现起边现象,有什么办法可以补救? 如果你是你们学校便利店的店长,你该怎么样安排日常作业管理工作_百度...