java中对原始变量的引用存储在哪里?

Cyp*_*erZ -2 java memory-management heap-memory stack-memory

我知道原始值存储在堆栈中,非原始值存储在堆中。据我所知,堆栈还包含对非原始值的引用。现在我的疑问是我们在哪里存储对原语的引用?即,例如,

int a=10;
Run Code Online (Sandbox Code Playgroud)

现在据我所知,值 10 存储在堆栈中,但我的问题是该值a存储在哪里?

另外请推荐一些学习 Java 内存管理的好资源。我在网上读了很多东西,但没有一个对我来说是清楚的。

mar*_*ace 5

因此,说原语(仅)存储在堆栈上而引用(仅)存储在堆上是不正确的。首先,一些代码:

public static main( String args... ) {
  Widget w = new Widget();
}

class Widget {
   private int i = 10;
   private String name = "FooBar";
}
Run Code Online (Sandbox Code Playgroud)

因此main,在 中,引用w(规范地)存储在堆栈上。引用指向的实例存储在堆上。

在该实例中,有一个变量i存储在堆上,因为它是Widget实例的一部分。还有对另一个对象的引用,name该引用指向"FooBar"也存储在堆上的第二个对象实例。

w因此,这里是堆栈上的引用和name堆上的引用的示例。它们可以存储在任一位置。

与原语同上。我认为您了解原语如何存储在堆栈中。所以我Widget在堆上存储了一个原语来展示它是如何工作的。

(话虽如此,如果编译器或 JVM/OS 确实愿意,“堆栈”可以保留在堆上,并且可以在堆栈上分配小对象以提高速度,所以这确实有点复杂。但是忽略棘手的问题东西,通常我们说堆栈和堆的工作方式就像上面一样。)

另外请推荐一些学习 Java 内存管理的好资源。 在您的大学学习一两门系统编程课程(通常一门关于编译器/链接器,一门关于“如何编写操作系统”)。如果你还没上大学,那就去大学吧。有些东西他们不会通过阅读一些随机的 WordPress 博客来教授。

值“a”存储在哪里?“a”只是源文本使用的标签,它在运行时被有效删除。编译器(运行时字节码或汇编语言)仅使用一个数字来引用变量,该数字只是堆栈上的偏移量(或位置)。这就像访问数字数组一样。堆栈就像一个 int 数组stack = new int[100]或其他什么,每个局部变量只是该数组中的一个数字、一个偏​​移量。这也包括引用,它们存储在堆栈中的偏移量处,并且它们本身只是通过对象内存中位置的地址(作为数字)“指向”堆内存。它变得更加复杂,因为堆栈也可以有字节和字符(16 位)和长整型,但 CPU 和汇编语言可以很好地处理。