如何实现对java对象的引用?

指针是否仅用于实现java引用变量或它是如何实现的? 以下是Java语言规范中的行

4.3.1对象对象是类实例或数组。 引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它指的是没有对象。

这是否意味着它一直是指针?

在现代JVM中,引用实现为地址。

回到HotSpot的第一个版本(以及“经典VM”的早期版本),引用被实现为句柄。 这是指向指针的固定指针。 第一个指针永远不会因任何特定对象而改变,但随着对象数据本身的移动,第二个指针会发生变化。 显然这会影响使用中的性能,但更容易编写GC。

在JDK7的最新版本中,支持“压缩oops”。 我相信BEA JRockit已经有一段时间了。 迁移到64位系统需要两倍的内存,因此需要地址带宽。 “压缩的oops”利用最不重要的三位或四位地址始终为零。 32位数据左移三或四位,允许32或64 GB的堆而不是4 GB。

您可以从这里获取源代码: http : //download.java.net/jdk6/source/

对你的问题的简短回答是:是的,有一个指向你的java变量的内存位置的指针(还有一点额外的)。 然而,这是一个巨大的过度简化。 在VM中移动java变量涉及许多C ++对象。 如果你想弄脏,请看一下hotspot \ src \ share \ vm \ oops包。

实际上,这对于开发java并不重要,因为你没有直接使用它的方式(其次你不想这样,JVM针对各种处理器架构进行了优化)。

答案将取决于每个JVM实现,但最好的方法是将其作为句柄。 它是JVM可以在表或其他一些此类实现中查找引用的内存位置的值。 这样,JVM可以在垃圾收集期间在内存中移动对象,而无需在任何地方更改内存指针。

原始类型始终按值传递。 其中,类变量实际上是Object的引用变量。

考虑一个原始类型:

int i=0; 

现在,此基本类型的值存储在地址2068的内存位置。每次使用此基本类型作为参数时,都会创建一个新副本,因为它不是通过引用传递而是按值传递。

现在考虑一个类变量:

 MyClass C1 = new MyClass(); 

现在,这将创建一个类型为MyClass的对象,其变量名为C1。

类变量C1包含链接到Valriable C1的对象的存储位置的地址。 所以基本上类变量C1指向对象位置(new MyClass())。

原始类型存储在堆栈中,堆栈中存储对象。

这是否意味着它一直是指针?

是的,但它不能像你通常在C中那样被操纵。

请记住,Java是一种依赖于其VM的不同编程语言,这个概念(指针)应该仅用作类比来更好地理解这些工件的行为。