java引用变量存储在哪里?

Tae*_*wan 8 java memory variables pointers reference

Java的引用变量是如何存储的?这是否与C指针类似?

我的意思是引用变量是这段代码中的myDog

Dog myDog = new Dog();
Run Code Online (Sandbox Code Playgroud)

我理解了C指针,它存储在堆中的全局变量,并且它存储在堆栈中的局部变量.我想知道java工作方式相同.

ζ--*_*ζ-- 22

您需要了解一些较低级别的Java内存组织.在堆栈上,存储指向堆的基元(int,double,boolean等)和对象引用.

在任何对象内部都是如此.它或者直接包含对其他对象或基元的引用.对象始终在任何上下文中引用,并且这些引用按值传递.

所以我们可能有:

[ STACK ]                          [ HEAP ] 
int a: 10;                     ->  MyWrapperObject@21f03b70====||
double b: 10.4;                |   ||     int someField: 11    ||
MyWrapperObject@21f03b70 ------|   ||     String@10112222  ---------- 
......                             ||==========================||    |
                                                                     |
                                                                     |
                                    String@10112222============||<----
                                    || ...                     ||
                                    || ...                     ||
                                    }}=========================||
Run Code Online (Sandbox Code Playgroud)

请注意,在某些情况下(如通过JVM内部)对象可能会存储在非堆内存中.


Ted*_*opp 1

Java 的工作方式相同。请注意,Java 中没有变量具有对象作为值;所有对象变量(和字段)都是对对象的引用。对象本身由 Java 虚拟机维护在某个地方(通常在堆上)。Java 具有自动垃圾收集功能,因此(与 C 不同)您无需担心释放对象。一旦对它的所有实时引用超出范围,它最终将被垃圾收集器清除。

例如:

Dog myDog = new Dog();
someMethod(myDog);
Run Code Online (Sandbox Code Playgroud)

传递someMethod给 所引用的狗对象的引用myDog。对象内部可能发生的更改将在方法返回后someMethod看到。myDog