【问题标题】:java and memory layoutjava和内存布局
【发布时间】:2010-12-15 10:34:05
【问题描述】:

大家好,我正在复习一些问题,但我无法真正弄清楚,我翻阅了教科书,但我不确定在哪里可以找到答案...

我知道做没有图片的内存图会很困难,但请多多包涵。

interface Lovable
   public void love();

class Foo implements Lovable
   public void love();
      // something
   public int val()
      // return something1

public class Love
   public static void main(String args [])
      Foo foo = new Foo()
      foo.love()
      foo.love()
      int bar = =foo.val()
      System.out.print(v)

现在,我看到 foo 是用 new 声明的,所以我知道实际的 Foo 类信息存储在堆中并且有一个框架?指针?它指向堆栈顶部的内存空间(在 foo 调用任何方法之前)。那么界面呢?那也会存储在堆中吗?

所以在堆栈的底部将是类 Love(也包含 int bar),一个指向堆中 Foo foo 的指针,一个用于 foo.love() 的框架,另一个框架 foo.love(),一个foo.val() 的框架,打印的框架?

我明白了吗?还是我真的很遥远?如果您知道我可以从哪里获得更多信息,请告诉我。我很感激任何意见..

【问题讨论】:

    标签: java memory-management diagram


    【解决方案1】:

    一般来说,对象是存储在由垃圾收集器管理的heap上。

    只有latest release of Java 6 有逃逸分析,如果对象没有逃逸,则将其存储在堆栈上。

    类信息存储在perm space

    【讨论】:

      【解决方案2】:

      foo 引用在堆栈上。 foo 指向的对象在堆上(在简单的情况下它实际上可能被优化到堆栈上,但从概念上讲它在堆上)。

      对象的类可能有超类并实现接口。但是,无论在哪个类中声明字段,实例字段都保存在堆上相同的内存分配中。

      【讨论】:

        【解决方案3】:

        内存布局取决于 JVM,而 JVM 在如何使用内存方面有很多余地,只要它们保持程序员所考虑的 Java 对象模型的逻辑视图即可。 Sun JVM 有几个“堆”,因为它实现了分代垃圾收集。对象是在伊甸园空间中创建的,它被视为堆栈,因此可以非常快速地创建对象。如果它们的寿命足够长,对象就会被移到寿命更长的世代中,并且这些对象的实现更像是正常的动态分配堆。 JVM 将类和内部字符串存储在“permspace”堆中。 Permspace 实际上并不是永久的:当不再引用它们的实例或类加载器时,就会收集类。而且,正如上面所指出的,如果 Java 6 可以确定对该对象的引用不会离开块,那么 Java 6 将在调用堆栈上分配一个对象。

        【讨论】:

          猜你喜欢
          • 2013-01-13
          • 2013-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-30
          • 2023-04-09
          相关资源
          最近更新 更多