java和内存布局

时间:2009-11-11 11:44:25

标签: java memory-management diagram

嘿伙计们,我正在审查一些问题,但我无法弄清楚,我翻阅了教科书,但我不确定在哪里可以找到答案......

我知道用图片做内存图会很困难,但请耐心等待。

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(),a fram for foo.val(),一个用于打印的框架?

我明白了吗?还是我真的很远?如果您知道我可以获得更多信息,请告知我们。我很感激任何投入..

3 个答案:

答案 0 :(得分:3)

通常,对象存储在垃圾收集器管理的heap上。

只有latest release of Java 6具有转义分析才能在堆栈中存储对象(如果它们没有转义)。

班级信息存储在perm space

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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