代码之家  ›  专栏  ›  技术社区  ›  Brixton Weiss

在方法内部创建的实例

  •  0
  • Brixton Weiss  · 技术社区  · 7 年前

    我还没有找到任何关于这方面的可靠文献,但我很好奇,如果一个对象是在一个方法中创建的,那么它存储在哪里?在java 8中是在堆栈上还是在堆上?

    public class A {}
    .
    .
    .
    public class B { 
      public void test(){
       A m = new A();
      }
    }
    

    我知道通常只有局部原语、引用变量和函数调用存储在堆栈上,而对象存储在堆中

    所以我假设以下两种情况之一是正确的

    • 案例1: 方法中实例化的对象通常存储在堆中,并在堆栈中引用该对象,然后当函数完成时,对象引用超出范围,堆中的对象可用于垃圾收集
    • 案例2: 方法中实例化的对象存储在堆栈中,然后在函数完成时可用于垃圾收集

    我强烈怀疑它的情况1,将一个对象存储在堆栈中是没有意义的,我产生怀疑的唯一原因是因为我遇到一些文献在堆栈上说,而另一些在堆栈上说

    感谢您提前提供反馈

    4 回复  |  直到 3 年前
        1
  •  1
  •   Hovercraft Full Of Eels    7 年前

    本地引用变量位于堆栈上,对象位于堆中。

    请注意,您的问题标题,

    在方法内部声明的实例

    由于声明了对象/实例,因此具有误导性 无处 --只有变量是,并且在方法中创建的对象可以放置在集合的字段上,或者放置在需要的任何位置。所以不能保证 应该 当方法退出时被GC。

        2
  •  0
  •   Ahmad Mekheber    7 年前

    所有对象都存储在堆中。。。每当内存不足时,垃圾收集器就会运行,因此它会清除不再使用的对象,并且也不会引用它们。

        3
  •  0
  •   Siddhesh Salgaonkar    7 年前

    案例1中指定的假设是正确的。这是一个很好的java内存分配源代码。

    Java Heap Space vs Stack – Memory Allocation in Java

        4
  •  0
  •   Yılmaz Durmaz    7 年前

    如果它们不是直接的“值”(不像类对象中的int属性),那么堆栈中只存储它们的引用值。它们的实际值和结构存储在堆中。

    它们按原样存储在堆栈中;

    int i=10;
    float f=10.00;
    bool b=true;
    

    这些将只在堆栈上有引用,它们将驻留在堆中(任何类型的类变量都是结构的一部分,并在堆上创建);

    int[] ii={1,2,3};
    double[] dd = new double[10];
    String s="String!!";
    Object o=new Object();
    

    传递给方法时,值将复制到新的堆栈变量(除非转换为引用对象)。引用也会传递给copycat堆栈变量,但由于它们是引用,所以它们都会重定向到同一对象(除非手动复制到一个全新的对象)。


    这部分可能对主题不感兴趣,由您决定

    在下面的代码中,number在堆栈上创建,并复制到方法的新堆栈值hello created on the heap,通过引用传递给s,然后在另一个堆地址上串联两个字符串,它现在保存这个新地址(字符串是不可变的)。Point对象作为字符串不是不可变的,因此可以在引用它的任何地方进行更改,因为它们是在堆上创建的,可以自由访问。

    class Point{ int x;int y;  Point(int x,int y){this.x=x;this.y=y;} }
    
    public class TestClass{
         public static void main(String []args){
            int number=5;
            String hello="Hello";
            Point point = new Point(2,4);
            Print(number,hello,point);
            System.out.println(hello+" "+number+" "+point.x+" "+point.y);
         }
         public static void Print(int i,String s,Point p){
            i+=5;
            s+="World!";
            p.x+=2; p.y+=2;
            System.out.println(s+" "+i+" "+p.x+" "+p.y);
         }
    }