我对java中的内存分配是在运行时还是在编译时感到困惑。
例如:
class Test{
int a;
public Test(){
a=10;
}
};
// somewhere else
Test t = new Test();
Run Code Online (Sandbox Code Playgroud)
是a在运行时分配还是在编译时分配?如果在编译时,java如何在直接获取已编译.class文件的VM上运行?
也:
什么时候a赋值10?
参考变量如何工作t?
谢谢。
编译时不会发生内存分配。仅在加载和运行时。
编译时将生成.class文件。
请记住,您需要有一个主类才能运行该程序。当您使用Java将类路径与.class文件一起运行程序时,将出现诸如加载和链接等步骤,
类加载器将文件加载到permgen。
调用main方法时,将创建堆栈并将局部变量放置在其中
当运行时遇到新的运行时,它将在堆上创建对象并在其中分配所需的内存,例如Test所需的内存。
局部变量和方法参数(如基元或引用)在编译时在概念上分配到堆栈上的一个位置。
在运行时,这不能保证反映它在内存中的布局方式。
堆上的对象分配只发生在运行时。
java怎么可能在VM上运行,它直接编译.class文件。
只有 VM 知道代码将如何编译,因此无法在编译时进行内存分配。
什么时候赋值 10
在分配发生的行。鉴于它没有被使用,JIT 可以丢弃它,因此它可能根本不会发生。
同样的问题也代表参考变量 t。
t=在对象被构造之后被赋值的地方。
| 归档时间: |
|
| 查看次数: |
12015 次 |
| 最近记录: |