java吧 关注:1,223,245贴子:12,679,822
  • 11回复贴,共1

jvm怎么加载实例变量的?

只看楼主收藏回复

学习java遇到瓶颈,百度无果,特来询问贴吧大佬.问题如下:
java虚拟机从硬盘加载class文件到内存时,有说除了实例变量都加载,就是不加载实例变量,而是要等到new之后加载到堆里,如果是这样的话,是把实例变量从硬盘里直接加载到堆里吗?这样的话加载器在从硬盘加载class文件的时候还分了两批?第二批专门去加载实例变量?有大佬解释下?


IP属地:江苏1楼2018-02-02 09:51回复
    问题偏底层,能回答的人太少了。


    IP属地:江苏来自Android客户端2楼2018-02-02 11:52
    回复
      首先你别混淆概念,你要分清引用和对象的概念。我从你的描述中理解,你所谓的变量指的是引用,但以后希望你一定要说清楚。
      1.引用分情况,有没有被初始化。假如这个引用初始化指向了一个对象,那么这个引用会在加载进内存里时,会在堆里创建一个对象并指向它。若没有初始化,那么这个引用就是null,加载到内存中时不会在堆中创建对象。
      2.引用分静态成员引用还是实例成员引用,还是方法里的引用。静态成员引用会在常量池中的class对象(字节码对象)中。实例成员引用会在堆中的实例对象中。方法里的引用是在方法被执行时,存在栈中,方法调用完即出栈释放。
      变量以后你要分清,因为原始类型的变量不是引用,指向对象的才是引用。
      要想了解更多看《深入理解java虚拟机》这本书


      IP属地:浙江3楼2018-02-02 12:36
      收起回复
        类变量加载到方法区。实例变量在new的时候,存在堆内存中开辟的空间中。也就是说实例变量在堆内存


        IP属地:湖北来自Android客户端5楼2018-02-02 14:30
        回复
          我觉得如果是初学的话还是不要过于纠结这个比较好


          6楼2018-02-02 14:37
          回复
            去看一下类的加载过程。


            IP属地:福建7楼2018-02-02 14:40
            回复