java 把hashmap=null,gc 会自动回收里面所有的堆里面的内存空间吗

zyq654321 2021-05-14 09:45:08
其他的集合类对象也有同问题,clear后会自动回收吗
...全文
3523 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
老王就是我 2021-05-25
  • 打赏
  • 举报
回复
引用 14 楼 冰思雨 的回复:
hashmap = null; 如果 hashmap 变量,在后面不再引用其他 HashMap 对象的话,原先引用的 HashMap 对象,会被GC垃圾回收。 在回收 HashMap 对象时, 对象内部的关于其他对象的引用,也会被剥离,断开引用关系,那么,被引用的对象的引用计数会被减一。 如果一个对象的引用计数为零时,就可以被垃圾回收了。 楼主应该先掌握一下基础知识,垃圾回收时,如果回收的对象中,存在其他对象的引用,怎么办? 当然是去除引用关系咯。所以,HashMap对象,依然遵循这种方式,这是通用的回收过程。 当然,一次垃圾回收,可能无法完成所有对象的回收(比如断开的引用对象,如果引用计数为零的话,可能下一次清理时才会被回收), 这个和垃圾回收算法有关,但是,多来几次,总是能够回收干净的。 另外,关于 堆 和 栈 的相关内容。 堆里面保存的是对象的数据内容,他的引用会保存在栈里,或者堆里。 为啥引用会保存到两个位置呢? 1. 函数内部声明的引用,这个引用会被保存在栈里面,引用指向的对象,在堆里。 2. 对象里面还引用了其他对象,那么,由于对象的数据在堆里,所以,对象对其他对象的引用也当然要保存在堆里面咯,因为,这个引用就是对象数据的一部分。 楼主明白了吗? 举个例子:

class A {
   int i=1;
}
class B {
   A a = new A();
}
public static void main(String[] args){
   // 代码从这里开始执行。
   B b = new B();
   // 构造 B 对象后,b引用是函数的局部变量,b保存在栈里面,而b指向的对象在堆区。
   // B对象的数据在堆区,我们发现 B 里面有个A对象。
   // A对象的引用 a 是 B 对象的成员变量,所以,引用 a 作为B 的数据成员,保存在堆区了。
   // 引用a指向的A对象,它的数据也会保存在堆区,里面有 i 变量。
   b = null;
   // 下面就有机会对B对象进行垃圾回收了,因为 b=null 之后,B对象的引用计数为零了。
   // 对B对象进行回收时,发现有A对象的引用a,所以,会去除a的引用关系,类似于 b.a=null 的操作。
   // 之后,我们观察到 A 对象由于上一步的引用关系去除,它的引用计数也为零了,那么,它也具备被回收的条件了,
   // 但,有可能下次清理时才会被回收,也有可能本次清理时就会被回收,具体要看堆区的存储状况以及垃圾回收的算法。
}
你说的这个太基础了,一般不到高级是不需要背的
xiaoxiangqing 2021-05-20
  • 打赏
  • 举报
回复
hashmap=null;gc会回收
老王就是我 2021-05-19
  • 打赏
  • 举报
回复
引用 8 楼 Java全栈路线 的回复:
看你map里面存放的对象是什么,你把map == null 的话只是把map这个对象本身的引用给去掉,gc的时候检查到 map 没被引用只会回收map这个对象本身。然后里面的对象还需要再判断有没有别的 root 下面去引用到,只有当对象本身没被强引用,或者弱虚引用时,gc才会进行清理。
额,hashmap这个变量不会被gc回收,jvm虚拟机栈栈帧弹出的之后,这个变量已经没了,不会放进堆里
老王就是我 2021-05-19
  • 打赏
  • 举报
回复
分两种:

hashmap=new HashMap();
这种,gc干活的时候会回收

hashmap=null;
这种则不会,当栈帧弹出的时候,hashmap这个变量已经没了
冰思雨 2021-05-19
  • 打赏
  • 举报
回复 1
hashmap = null; 如果 hashmap 变量,在后面不再引用其他 HashMap 对象的话,原先引用的 HashMap 对象,会被GC垃圾回收。 在回收 HashMap 对象时, 对象内部的关于其他对象的引用,也会被剥离,断开引用关系,那么,被引用的对象的引用计数会被减一。 如果一个对象的引用计数为零时,就可以被垃圾回收了。 楼主应该先掌握一下基础知识,垃圾回收时,如果回收的对象中,存在其他对象的引用,怎么办? 当然是去除引用关系咯。所以,HashMap对象,依然遵循这种方式,这是通用的回收过程。 当然,一次垃圾回收,可能无法完成所有对象的回收(比如断开的引用对象,如果引用计数为零的话,可能下一次清理时才会被回收), 这个和垃圾回收算法有关,但是,多来几次,总是能够回收干净的。 另外,关于 堆 和 栈 的相关内容。 堆里面保存的是对象的数据内容,他的引用会保存在栈里,或者堆里。 为啥引用会保存到两个位置呢? 1. 函数内部声明的引用,这个引用会被保存在栈里面,引用指向的对象,在堆里。 2. 对象里面还引用了其他对象,那么,由于对象的数据在堆里,所以,对象对其他对象的引用也当然要保存在堆里面咯,因为,这个引用就是对象数据的一部分。 楼主明白了吗? 举个例子:

class A {
   int i=1;
}
class B {
   A a = new A();
}
public static void main(String[] args){
   // 代码从这里开始执行。
   B b = new B();
   // 构造 B 对象后,b引用是函数的局部变量,b保存在栈里面,而b指向的对象在堆区。
   // B对象的数据在堆区,我们发现 B 里面有个A对象。
   // A对象的引用 a 是 B 对象的成员变量,所以,引用 a 作为B 的数据成员,保存在堆区了。
   // 引用a指向的A对象,它的数据也会保存在堆区,里面有 i 变量。
   b = null;
   // 下面就有机会对B对象进行垃圾回收了,因为 b=null 之后,B对象的引用计数为零了。
   // 对B对象进行回收时,发现有A对象的引用a,所以,会去除a的引用关系,类似于 b.a=null 的操作。
   // 之后,我们观察到 A 对象由于上一步的引用关系去除,它的引用计数也为零了,那么,它也具备被回收的条件了,
   // 但,有可能下次清理时才会被回收,也有可能本次清理时就会被回收,具体要看堆区的存储状况以及垃圾回收的算法。
}
少威 03-26
  • 举报
回复
@冰思雨 感谢大佬如此详尽的讲解,小弟受益了
老王就是我 2021-05-19
  • 打赏
  • 举报
回复
引用 12 楼 Java全栈路线 的回复:
[quote=引用 11 楼 老王就是我 的回复:][quote=引用 8 楼 Java全栈路线 的回复:]看你map里面存放的对象是什么,你把map == null 的话只是把map这个对象本身的引用给去掉,gc的时候检查到 map 没被引用只会回收map这个对象本身。然后里面的对象还需要再判断有没有别的 root 下面去引用到,只有当对象本身没被强引用,或者弱虚引用时,gc才会进行清理。
额,hashmap这个变量不会被gc回收,jvm虚拟机栈栈帧弹出的之后,这个变量已经没了,不会放进堆里[/quote] 是这样的吗?hashmap所在的方法还没走完,这个对象会被弹出么?如果该对象是通过参数引用进来的,这个方法执行完毕应该都不会弹出吧?我之前看的帖子说的栈是压方法那些的,方法执行完了弹出的时候里面定义的局部变量会一起清理掉。 你这个说法有什么案例可以测试一下吗,我再去了解学习一下[/quote] 变量不会放进堆,只有大对象(复杂类型之类的)才会放入堆,非静态变量都是走栈帧的,无论怎么传递,总会出来的。这个没办法测试,只能用插件去看指令。idea的插件名字叫——JClass。。。后面忘了,前面的没错。指令代表什么意思你自己去翻百度吧
Java全栈路线 2021-05-19
  • 打赏
  • 举报
回复
引用 11 楼 老王就是我 的回复:
[quote=引用 8 楼 Java全栈路线 的回复:]看你map里面存放的对象是什么,你把map == null 的话只是把map这个对象本身的引用给去掉,gc的时候检查到 map 没被引用只会回收map这个对象本身。然后里面的对象还需要再判断有没有别的 root 下面去引用到,只有当对象本身没被强引用,或者弱虚引用时,gc才会进行清理。
额,hashmap这个变量不会被gc回收,jvm虚拟机栈栈帧弹出的之后,这个变量已经没了,不会放进堆里[/quote] 是这样的吗?hashmap所在的方法还没走完,这个对象会被弹出么?如果该对象是通过参数引用进来的,这个方法执行完毕应该都不会弹出吧?我之前看的帖子说的栈是压方法那些的,方法执行完了弹出的时候里面定义的局部变量会一起清理掉。 你这个说法有什么案例可以测试一下吗,我再去了解学习一下
Java全栈路线 2021-05-18
  • 打赏
  • 举报
回复
看你map里面存放的对象是什么,你把map == null 的话只是把map这个对象本身的引用给去掉,gc的时候检查到 map 没被引用只会回收map这个对象本身。然后里面的对象还需要再判断有没有别的 root 下面去引用到,只有当对象本身没被强引用,或者弱虚引用时,gc才会进行清理。
韩_师兄 2021-05-18
  • 打赏
  • 举报
回复
引用 5 楼 zyq654321 的回复:
[quote=引用 4 楼 zyq654321的回复:]hashmap本身肯定我不关心,关心的是里面包含的对象,在堆里面的那些对象所占用的内存能否自动被gc回收
hashmap对象本身在堆里面的内存肯定能回收,我关心的是里面引用的对象,在堆里面的引用如果出来hashmap之外没被别人引用,那些对象所占用的内存能否自动被gc回收,[/quote] 肯定可以啊,看一下gc的回收依据.没对象没有被引用,就可以标记为可清楚,只是有gc去决定
maradona1984 2021-05-18
  • 打赏
  • 举报
回复
引用 5 楼 zyq654321 的回复:
[quote=引用 4 楼 zyq654321的回复:]hashmap本身肯定我不关心,关心的是里面包含的对象,在堆里面的那些对象所占用的内存能否自动被gc回收
hashmap对象本身在堆里面的内存肯定能回收,我关心的是里面引用的对象,在堆里面的引用如果出来hashmap之外没被别人引用,那些对象所占用的内存能否自动被gc回收,[/quote] 会被回收,前提是这些对象没有其他对象引用(根节点不可达的对象)
zyq654321 2021-05-18
  • 打赏
  • 举报
回复
引用 4 楼 zyq654321的回复:
hashmap本身肯定我不关心,关心的是里面包含的对象,在堆里面的那些对象所占用的内存能否自动被gc回收
hashmap对象本身在堆里面的内存肯定能回收,我关心的是里面引用的对象,在堆里面的引用如果出来hashmap之外没被别人引用,那些对象所占用的内存能否自动被gc回收,
zyq654321 2021-05-14
  • 打赏
  • 举报
回复
hashmap本身肯定我不关心,关心的是里面包含的对象,在堆里面的那些对象所占用的内存能否自动被gc回收
KeepSayingNo 2021-05-14
  • 打赏
  • 举报
回复
hashmap=null 只是把这个map对象置为空,里面的元素还存在,只不过这种引用失去了联系,GC是否回收,那时JVM根据情况决定的,不一定立马就回收
usecf 2021-05-14
  • 打赏
  • 举报
回复
java中有垃圾回收机制 会根据使用情况以及优先级 gc会自动回收的 c++中new的东西 是要手动释放的
  • 打赏
  • 举报
回复
hashmap的 key与value之间存在强引用,是不会被垃圾回收的 map里边元素如果是new出来的,就需要自己手动释放 map.clear()只是把内存还给了堆,并没有还给OS,内存对象还是存在的,进程占用的内存会一直增加 map=null 自己手动释放

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧