开发者社区> 问答> 正文

java强引用回收?? 400 报错

java强引用回收?? 400 报错

类似String a = new String("ddd");都是强引用。以前因为只要过了作用域,就会自动被回收的。难道都要a=null来保证可以回收?

像web框架,来一个请求就会new 一个action来处理,也没有看到设为null啊,如果不会回收,难道请求多了不会内存溢出?

展开
收起
爱吃鱼的程序员 2020-06-04 11:22:25 450 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    创建的局部变量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(),可能会存在很久。


    ######回复 @铂金小虫 : 对,但是时间不确定。a是临时变量,而new Object()是一个对象,通常会分配到堆内存中,通常情况大部分GC收集器,都是在内存不够的时候,才会出发GC,所以new Object()这个对象会在堆中存在,具体时间不确定!按照你的场景,Object这个对象,会在eden区间的第一次GC的时候,被 回收掉。######如果在一个方法内定义Object a = new Object(),a在栈上的,过了作用域就没了,此时没有别的引用只向Object(),那对象就会在某个时候被回收吧。######我先说下上面说得有点不对,封装好的方法new对象是很快销毁的######

    JVM的对象回收目前常规手段是不能控制的,完全取决于jvm gc机制。烟头所说是对的.

    2020-06-04 14:32:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载