java强引用回收?? 400 报错
类似String a = new String("ddd");都是强引用。以前因为只要过了作用域,就会自动被回收的。难道都要a=null来保证可以回收?
像web框架,来一个请求就会new 一个action来处理,也没有看到设为null啊,如果不会回收,难道请求多了不会内存溢出?
创建的局部变量a分配在运行栈的栈帧上,当方法返回时,当前栈帧会弹出并销毁,该引用便不再存在了。
如果是方法中某个代码块(比如循环体内)内部声明的变量,在出了作用域之后,栈帧上为他分配的位置可以被后面声明的变量重用,这种情况下原来的引用也就会不存在。但如果变量出了作用域,空间一直未被重用,则需要等到方法结束整个栈帧失效。
栈帧的分配是由编译器在编译时就已经决定好了的。
以上仅是说的是解释执行时的情况,如果这个方法被虚拟机运行编译器编译成机器码时,这个引用会在作用域结束后被立即识别并清除。
另外,在不讨论软引用和弱引用的情况下,单独说强引用,也不是说只要强引用不可达,对象就马上回收的,这只是一个gc时候的判定条件
######任何对象赋值=null.都会被回收掉. 这个你放心. 你理解有点误差.
String a = new String("ddd"); String b = new String("ddd"); String c = "ddd"; String d = "ddd"; System.out.println(a == b); System.out.println(b == c); System.out.println(c == d);看看区别. ######你说的对 过了作用域就会被回收 但是回收时机是jvm自己决定的######
GC大部分回收的都是强引用,只要强引用还存在,GC就不会回收!
判断是否引用还存在,可以看GC ROOTS Tracing。
楼上的楼上说的是基于栈的解释器执行过程。
千万不要搞错了,GC关注的更多的是new Object(),而不是Object obj。
obj可能很快消失,而new Object(),可能会存在很久。
JVM的对象回收目前常规手段是不能控制的,完全取决于jvm gc机制。烟头所说是对的.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。