繁体   English   中英

Java中存储的内存地址在哪里

[英]Where are memory addresses stored in Java

Java中的内存地址存储在哪里? 我想要了解的是如何存储以下内容。 我已经知道堆栈和堆之间的区别,但尝试深入研究。

int i = 5;

i是分开存放,还是5分开存放,然后建立映射?

类似地,我们说对于32位版本,最多可以有4 GB RAM(实际上要少得多),所有这些内存块的内存地址都存储在哪里?

我想要了解的是如何存储以下内容。

这取决于int i = 5; 是:

局部变量

如果那是在一个方法中,因此i是一个局部变量,那么5被存储为堆栈中的本地( i没有“存储”在任何地方,字节码生成器只记得i在堆栈上的位置)。 字节码具有与局部变量交互的特定指令,包括一些非常有效的专用无参数版本,例如iload_0 ,它从“局部变量0”加载一个int (那些经过iload_3 ,然后有一个版本服用精氨酸, iload其次为指数。)

考虑这个课程:

public class Example {

    public static final void main(String[] args) {
        int i = 5;

        System.out.println(i);
    }
}

这是字节码(你可以通过编译然后执行javap -c Example来获得这个),右边有注释:

public class Example {
  // ...omitted constructor stuff...

  public static final void main(java.lang.String[]);
    Code:
      // The `int i = 5;` line:
       0: iconst_5               // Load the constant 5 onto the stack
       1: istore_1               // Store it in local variable 1

      // The `System.out.println(i);` line:
       2: getstatic     #2       // Get the static field java/lang/System.out:Ljava/io/PrintStream onto the stack
       5: iload_1                // Load int variable 1 on the stack
       6: invokevirtual #3       // Call java/io/PrintStream.println, which gets
                                 // the stream and what to write from the stack
       9: return
}

请注意堆栈的两种不同用途:“locals”位于堆栈的一部分,该方法为本地分配了自己(因为它事先知道有多少),然后是动态部分,然后是它用于将信息传递到方法等中。

实例字段

如果那是在类定义中,因此i是类的实例字段,那么i就是Java为实例保留的结构的一部分(在堆栈或堆上,有时在它们之间移动)。

字节码并没有真正摆脱了很多这种光的,但考虑到这个类:

public class Example {

    int i = 5;

    public static final void main(String[] args) {

        Example ex = new Example();
        System.out.println(ex.i);
    }
}

这是字节码:

public class Example {
  // Here's the instance field
  int i;

  // ...omitted the constructor stuff...

  public static final void main(java.lang.String[]);
    Code:
      // Create our Example instance and save it in a local variable
       0: new           #3
       3: dup
       4: invokespecial #4
       7: astore_1

      // The `System.out.println(ex.i)` line:
       8: getstatic     #5     // Get the java/lang/System.out:Ljava/io/PrintStream field
      11: aload_1              // Get `ex` onto the stack
      12: getfield      #2     // Get the value of field `i` onto the stack from the instance we just put on the stack (pops the instance off)
      15: invokevirtual #6     // Call java/io/PrintStream.println, which
                               // again gets the stream to write to and
                               // what to write from the stack
      18: return
}

Java中的内存地址存储在哪里?

在Java中,引用不仅仅是内存地址,而且由于压缩的oop,它们很少用于与Java相关的数据。

我想要了解的是如何存储以下内容。

值得记住的是,JVM是一个虚拟机,您可以说它是如何在字节代码中以理论方式存储的,但代码本身经历了多个优化阶段,并且每次都可以更改。

此外,JVM非常擅长优化代码,这些代码在许多琐碎的情况下都没有做任何事情。 没有任何地方,代码已被内联到任何东西。

我已经知道堆栈和堆之间的区别,但尝试深入研究。

 int i = 5;

我是单独存储还是单独存储,然后建立映射?

在运行时,很有可能内联的值已经存在。 但是,它可能位于堆栈,堆或两者上,具体取决于上下文。

类似地,我们说对于32位版本,最多可以有4 GB RAM(实际上要少得多),所有这些内存块的内存地址都存储在哪里?

在32位版本中,您只能使用最大的连续区域作为堆。 这限制在Windows上大约1.4 GB和Unix上大约3 GB。

在64-it版本中,它通常使用32位引用,通过转换允许您处理最多32 GB(Java 7)和64 GB(Java 8)而不使用Compressed Oops您可以寻址48位地址大多数操作系统上的空间(受硬件和操作系统限制)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM