jvm 内存分配疑惑

通常,我们通过
Object obj = new Object() 来定义一个类实例。
Object obj:定义了一个Object类型的变量,这个变量可以指向一个Object类型实例,new Object()是创建了Object实例。=将obj指向了new Object()指向的实例,通过操作这个变量来操作实例。这样的理解是没有错的,疑惑在于:
Object obj执行时,定义的这个obj要分配内存,它的大小会是多大呢?在什么时候分配,在编译的时候还是运行的时候,分配在哪里?
还有,如果我再有一句,Object obj2 = new Object().
那么在内存中obj与obj2如何来标识本身呢?
[b]问题补充:[/b]
感谢四位朋友解答,其实我明白obj是一个引用,new Object()是一个实例。多谢你们帮助我清楚了栈与堆的内存分配。

当我们通过:System.out.println(obj)时,得到的结果是"类名@一串十六进制的值"。
这串十六进制的值是引用在内存中的地址还是实例在内存中的地址呢?

另外,请教大家有没有一个方法或者第三方的工具来查看内存的具体分配情况呢?

实例在内存中的地址

Object obj 只是引用
Object obj = new Object(); 意思是obj的引用指向new Object()的地址
new 出来的内存空间大小取决与 类 大小
obj 与 obj2只是引用,两个分别占用不同的内存空间

PS:引用也是一种对象.

这是我的理解,希望对你有帮助

当然是在运行的jvm把类字节码加载进内存的时候才会给Object分配内存啊,
分配在堆空间里,

内存中obj与obj2如何来标识本身呢?
它们在内存地址来标识本身啊,jvm分配一块内存给对象,自然不会覆盖已有的地址空间,
把新的地址空间分配给新建的对象

Object a;
和Object a=new Object ();
的区别吧?

一个 是创建了Object 的引用 但没分配内存空间、、

一个是既分配的引用也创建了内存地址 把引用指向该内存

首先你要搞清楚 引用 和对象 在内存中是如何分配的
JAVA中所有对象都必须在堆内存中创建
所以 new Object();一定在堆内存创建了一个Object对象
Object o 是定义一个Object类型的引用
在JAVA中 引用就像C的指针 是会创建在栈内存的
Object o = new Object();
是将一个堆内存的Object对象 指向栈中它的引用
o 这个指针保存了 new Object这个对象的堆内存地址

需要使用C的DDL来配合查看,没有研究过......