您的位置:首页 > 其它

GC对象与类的加载机制

2017-11-29 16:35 120 查看
1,可以作为GC roots的对象包含以下几种:

   1:虚拟机栈(栈帧中的本地变量表)中引用 的对象。

    2:方法区中类静态属性引用的对象。

    3:方法区中常量引用的对象。

    4:本地方法栈中引用的对象。

2,可以被回收的类需满足的条件

     1:该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。

     2:加载该类的ClassLoader已经被回收。

      3:该类对应的Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

3,虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化、最终形成可以被虚拟机直接使用的java类型。这就是虚拟机的类加载机制。

         类从被加载到虚拟机内存中开始,到卸载出内存位置,整个生命周期:

                 加载、验证、准备、解析、初始化、使用、卸载。

                        其中 验证、准备、解析3个周期较长

4,类的初始化时机

          1:遇到new、getstatic、putstatic、invoestaic这4条字节码指令时,如果类没有初始化,则先触发初始化。

               生成这四条指令最常见的场景是:使用new关键字实例化对象的时候,读取或者设置一个类的静态字段时,以及调用一个类的静态方法的时候。

           2:使用反射包的方法对类进行反射调用的时候,如果类没有初始化,则先触发其初始化。

           3:当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

           4:当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。

5,类加载过程虚拟机完成的事情

           1:通过一个类的全限定名来获取定义此类的二进制字节流。

            2:将这个字节流所代表的静态存储结构转化为方法区运行时的数据结构。

           3:在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  虚拟机