日期:2014-05-20  浏览次数:20724 次

Java编译原理
public class Test {
  private String name;

  public static void main(String args[]) {
  Test test = new Test();
  }
}


我想知道,在程序编译期间.JVM都执行什么了. 给成员变量name分配空间了吗.是分配在栈上面的吗. new是在运行期间才动态分配内存吧.在编辑期间new是不是不执行.那么.程序运行期间才执行new 才有的对象.那么,对象的属性是在编辑期间就初如化了,而对象是要堆中的.那面对象的这个name属性是如何从栈中跑到堆中去的,这只是我的猜测.....

------解决方案--------------------
额~好混乱啊 编译的话 java 应该是 吧代码转化成字节码~之后就能在JVM中运行了,JVM运行时在再把字节码翻译成 相应的机器码。
只有在程序执行的时候,真正的运行代码。
对象的产生是在堆上的,包括他的 实例对象,也就是name应该产生在堆上的。
你在方法中生命的变量才是在栈上产生的~

------解决方案--------------------
首先编写好的源代码被编译程.class文件 这时没内存什么事

当 执行了 java.exe命令后 jvm会将制定的.class文件由类加载器加载到内存中去(至于什么是类加载器,有多少中类加载器,各有什么用,不要问我,我不知到,有本什么深入理解jvm的书也许能解释)

类加载器加载的时候会做一些事情比如
将静态的属性,方法放到池里
将你定义的基本类型和引用分配栈空间,如果有定义对象,并实例化的话,会在栈中分配该对象引用的空间,并在堆分配对象的空间 至于怎么处理方法不知到

java中引用和基本类型都在栈中,对象在堆中,原则上没有索引指向的对象会被垃圾回收,有时候可能不是这样的。