java - 在 JAVA 中,如何让一个对象只为函数的某些部分存在于内存中?

标签 java garbage-collection

我有一个运行很长时间的函数,我在该函数中声明并分配了一个对象。现在据我所知,只要此函数正在运行,该对象将至少存在于内存中,之后如果没有其他对象引用它,它将可用于垃圾回收。现在,我希望这个对象在函数运行完成之前可用于垃圾回收。在编码过程中:

     public void foo(){
             String title;
             Object goo=getObject();  //getObject is some other function 
     //which returns Object and can be null and I want Object to be in memory from here
             if(goo!=null)title=goo.getString("title"); 
           //after the last line of code I want Object to be available for garbage 
    // collection because below is a long running task which doesn't require Object.

              for(int i=0;i <1000000;i++)     //long running task
        {
        //some mischief inside with title 
        }

            }

现在,根据上述任务,我希望 Object 在 for 循环开始之前可用于垃圾回收。我可以做一些事情,比如在 for 循环之前将两行代码放在花括号内吗?如果不行,我该怎么做才能完成这个任务?

最佳答案

即使您什么都不做,该对象也不会在循环期间停留。一旦您的代码通过最后访问点,Java 将确定该对象不可访问。

可访问对象是可以在任何 Activity 线程的任何潜在持续计算中访问的任何对象。如今,JVM 在计算可达性方面非常聪明。如果它发现在循环期间或循环之后没有可能访问 goo 的代码延续,Java 会在最后一次访问点之后使该对象符合垃圾回收条件。即使最后一个访问检查器非常保守,没有对 goo 的访问权限也足以让 JVM 相信该对象不再可达。

参见 this Q&A了解更多详情。

关于java - 在 JAVA 中,如何让一个对象只为函数的某些部分存在于内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46871804/

相关文章:

java - jsp中的无效字符常量

pointers - Rust 的 Arc 和 Rc 类型与垃圾收集有何不同?

java - 初始化问题?

java - Spring Boot 千分尺计数取消

关于清除链表的 Java 最佳实践

java - 低暂停收集器 - 并发模式失败

java - 如何使用 "-Xlog:heap*=debug" "-Xlog:gc*=debug"从 GC 正确读取日志的某些部分

java - Java 中 native 资源映射的生命周期(以及如何保持它们同步)

java - Java中具有可变长度零宽度lookbehind的正则表达式

java - 将方法参数传递给java中byte,int,int类型的方法参数