Java 垃圾回收怎么理解
Java 垃圾回收怎么理解
打开电脑的回收站,等你删完文件、关闭网页后,系统会自动把没用的文件清掉,省出硬盘空间——其实Java里的“垃圾回收”,就像电脑的自动回收站清理,是Java程序自带的“清洁工具”,帮开发者省力气,不用手动管内存的“垃圾”。
什么是Java里的“垃圾”?
要懂垃圾回收,先得搞明白什么是要清的“垃圾”。举个日常例子:你在手机上开了个聊天窗口,发完消息后把它退到后台,没再看它,这个窗口占着手机内存,却没人用了——这就是“垃圾”。

对应到Java程序里,变量就是程序里的“小房间”,用来存数据。比如你写代码时临时存了个临时计算的数字,或者开了个没用到的网页链接对象,当这些变量再也没有被程序用到(比如聊天窗口退到后台后,没人再点开它),它们就成了“垃圾”,占着内存空间,要是不清理,程序会像手机一样变慢,甚至直接“卡崩”。
垃圾回收怎么找到这些“垃圾”?
找垃圾是垃圾回收的第一步,Java用了个简单的判断方法——“引用计数法”和“可达性分析”,后者更靠谱,也是实际用的方法。
先看引用计数法:每个对象身上贴个“计数器”,有人用它就加1,不用就减1,计数器为0就是垃圾。但这个方法有个小bug:要是两个对象互相引用(比如你建了个“朋友圈”对象,里面存着“好友”;“好友”对象里又存着“朋友圈”),他俩的计数器都不是0,但外面没人用,这俩就成了垃圾却没被清理。
所以Java用的是“可达性分析”:从“根对象”(比如程序里正在用的变量、静态对象)出发,像找朋友名单一样,把所有能被根对象碰到的对象都标记为“有用”,剩下没被碰到的,就是要清的垃圾。就像你从家(根对象)出发,能走到的邻居、超市都是“有用的”,那些没路能到的空房子,就是垃圾。
清垃圾的不同“打扫方式”
找到垃圾后,Java的垃圾回收器会用不同方法清,就像你用不同方式打扫房间的垃圾:
第一种是“标记-清除”:先把所有有用的对象标记,再把垃圾清掉。但清完后会留下一堆“小碎片”,就像打扫完的房间,到处是小纸团,没法放新的大物件,程序运行时可能找不到大空间,容易卡。
第二种是“复制”:把有用的对象搬到一块空地方,再把原来的地方全清干净。就像你把房间里有用的家具全搬到客厅空地上,把原来的房间彻底清空,这样新放东西就不会有碎片,但要多占一块空地方,有点浪费。
第三种是“标记-整理”:先标记有用的,再把所有有用的对象往一边挪,最后清掉另一边的垃圾。既没有碎片,也没浪费额外空间,就像你把房间里的家具都挪到一边,把另一边的垃圾清走,剩下的空间整整齐齐,适合放新东西。
这些方法各有优缺点,Java的不同版本会用不同的回收器,比如手机APP用的回收器,会更在意卡顿,就选打扫快的方法;服务器程序要省空间,就选整理得更整齐的方法。
简单说,Java垃圾回收就是自动清理程序里没用的内存,不用开发者手动删“垃圾”,让写代码更省心,也让程序跑得更顺——就像手机自动清后台,不用你手动删文件,用起来更舒服。