java虚拟机的自动内存管理机制(二)

1.内存分配:

    a.优先在新生代Eden区分配.Eden区没有足够的空间时,虚拟机发起一次Minor GC.

        (Major GC 是清理永久代。Minor GC 会清理年轻代的内存,Full GC 是清理整个堆空间—包括年轻代和永久代)

    b.大对象(需要大量连续内存空间的Java对象)直接进入老年代,避免大对象的复制.如很长的字符串或大数组.应该避免短命大对象的使用

    c.长期存活的对象将进入老年代.虚拟机给 每个对象定义一个对象年龄计数器.熬过一次Minor GC,计数器+1(默认15)进入老年代

    d.动态对象年龄判定:Survivor中年龄相同的对象,总大小大于Survivor的一半,所有大于等于该年龄的对象,直接进入老年代

          (HotSpot年轻代分三个区Eden,两个Survivor)[大小比8:1]

2.类加载的时机:

 

  

     类加载的时机虚拟机规范没有强制规定,看虚拟机自己具体实现.但规定了以下几种情况必须初始化(加载验证准备必须在此之前)

     a.new实例化对象,使用一个类的静态字段(被final修饰,编译期放入常量池中的静态字段除外),使用类的静态方法

     b.使用java.lang.reflect包的方法对类进行反射调用的时候

     c.初始化一个类的时候,发现其父类没有初始化,会先触发父类的初始化

     d.虚拟机启动时,用户指定要执行的主类(含有main方法的类),会触发虚拟机初始化这个主类

     e.

3.类加载器

      启动类加载器(Bootstrap ClassLoader)加载<java_home>/lib下的能被虚拟机识别的类,不能被Java程序直接引用

      扩展类加载器(Extension ClassLoader)加载<java_home>/lib/ext中的类.可以被程序员直接使用

      应用类加载器(Application ClassLoader)(系统类加载器)加载用户路径(ClassPath)上的类库

      自定义类加载器(可以自己实现)

      当一个类需要加载时,先检查是否加载过,若没有先由启动类加载器加载,没有此类的话,由扩展类加载器加载,最后由应用类加载器加载,防止了重复加载

 

posted @ 2017-03-03 21:39  我_会飞的鱼  阅读(135)  评论(0编辑  收藏  举报