• 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)上的类库

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

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

  • 相关阅读:
    Mysql命令非交互式执行SQL命令
    centos7离线安装rpm包自动解决依赖
    webpack
    【转】GUID学习
    Docker安装mysql
    C++的vector的使用方法
    php自动加载
    Spring MVC 入门笔记
    Java泛型
    Java输入输出
  • 原文地址:https://www.cnblogs.com/2nao/p/6497449.html
Copyright © 2020-2023  润新知