JVM加载类详情

    学习j2se,马士兵老师讲内存分析是如此的透彻,遇到这么精华的东西,让我不得不再写篇感悟博客以作总结和怀念,尽管这时候有软考的压力,但依然很过瘾。

    一提到j2se,一提到马士兵,我第一反应就是这张图。学习一门语言,知道内存,知道一切。

    JVM加载类详情_第1张图片

    不过,我想把内容再细化一些,所以下面有不少是自己的感悟,也许有的 理解是不合适的,也许有的理解等到学习j2ee时就会得到纠正,也许……,而唯一可以确定的是,这只是学习java的一个过程。

    写好一个.java文件,编译后,使用java命令运行。首先加载的类,肯定是和文件名相同的public类了。


    加载类详情:

    new 一个类时,JVM便在heap内存中为该对象分配一块地。

    加载类的顺序,先成员变量后方法;先静态,后非静态。

    1. 加载成员变量

    先加载static成员变量,放在datasegment内存区,始终只有一份,被同一类的每个对象共享。

    再加载非static成员变量,放在该对象占用的这块地里,如果没有初始化,JVM会帮我们处理这块地(初始化)。每个非静态成员变量在不同的对象中都有不同的值。


    2. 加载方法:

    方法放在code segment中,只有一份,被同一类的每个对象共享。

    先加载静态方法,放在codesegment内存区中,而main方法就是静态的,也是程序的入口点。他的寿命比较长,是这个类的整个生命周期。

    如果要访问静态方法,系统在codesegment中找一段具有标识性的代码段是很容易的,直接使用类名.静态方法名。

    再加载非静态方法,想要让堆中的对象找到codesegment中的这段代码,通过内部的函数指针就可以办到。new 类时,就需要执行构造方法了。(加载和执行可不一样)。

    1) 加载局部变量

    局部变量位于方法中,等到方法开始执行时,就该用到stack了。


你可能感兴趣的:(jvm)