我知道用图片做内存图会很困难,但请耐心等待。
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(),一个用于打印的框架?
我明白了吗?还是我真的很远?如果您知道我可以获得更多信息,请告知我们。我很感激任何投入..
答案 0 :(得分:3)
答案 1 :(得分:1)
内存布局取决于JVM,JVM在如何使用内存方面有很多余地,只要它们维护程序员所考虑的Java对象模型的逻辑视图即可。 Sun JVM有几个“堆”,因为它实现了分代垃圾收集。在eden空间中创建对象,将其视为堆栈,以便可以非常快速地创建对象。如果它们存活的时间足够长,那么对象就会被移动到更长寿的世代,并且这些对象的实现更像是正常的动态分配堆。 JVM在“permspace”堆中存储类和实现的字符串。 Permspace实际上不是永久性的:当没有对其实例或类加载器的引用时,将收集类。并且,如上所述,Java 6将在调用堆栈上分配一个对象,如果它可以确定对该对象的引用不会离开该块。
答案 2 :(得分:0)
foo
引用在堆栈上。 foo
指向的对象位于堆上(在简单的情况下,它实际上可以优化到堆栈中,但从概念上讲,它位于堆上)。
对象的类可能有超类并实现接口。但是,无论在哪个类中声明字段,实例字段都保存在堆上的相同内存分配中。