在Method中创建的实例

时间:2018-04-27 01:08:27

标签: java stack heap

我还没有找到任何关于此的可靠文献,但我很好奇如果一个对象在方法内部创建,它的存储位置是什么?在Java 8中的堆栈或堆上?

{{1}}

我知道通常只有本地原语,引用变量和函数调用存储在堆栈中,并且对象存储在堆中

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

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

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

感谢您提前的反馈

4 个答案:

答案 0 :(得分:1)

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

请注意您的问题标题

  

在Method

中声明的实例

具有误导性,因为对象/实例被声明 无处 - 只有变量,并且在方法中创建的对象可以放在字段中放入集合中,或者放在任何地方这需要。因此,当方法退出时,无法保证对象 GC。

答案 1 :(得分:0)

所有对象都存储在堆中......只要内存不足,垃圾收集器就会运行,因此它会删除不再使用的对象,也不会引用它们。

答案 2 :(得分:0)

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

Java Heap Space vs Stack – Memory Allocation in Java

答案 3 :(得分:0)

如果他们不是即时的"值" (不像类对象中的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,通过引用传递给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);
     }
}