万字详解JVM,让你一文吃透( 四 )

  • 扫描A Suvivor Space时,如果对象已经经过了几次的扫描仍然存活,JVM认为其为一个Old对象,则将其移到Old Gen 。
  • 扫描完毕后,JVM将Eden Space和A Suvivor Space清空,然后交换A和B的角色(即下次垃圾回收时会扫描Eden Space和B Suvivor Space 。
  • Tenure Generation Space(采用标记-整理算法)
    主要用来存储长时间被引用的对象 。它里面存放的是经过几次在 Young Generation Space 进行扫描判断过仍存活的对象,内存较大,垃圾回收频率较小 。
    Permanent Space存储不变的类定义、字节码和常量等 。
    Class文件Java虚拟机的平台无关性
    万字详解JVM,让你一文吃透

    文章插图
    Class文件的组成?Class文件是一组以8位字节为基础单位的二进制流,各个数据项目间没有任何分隔符 。当遇到8位字节以上空间的数据项时,则会按照高位在前的方式分隔成若干个8位字节进行存储 。
    魔数与Class文件的版本每个Class文件的头4个字节称为魔数(Magic Number),它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件 。OxCAFEBABE 。
    接下来是Class文件的版本号:第5,6字节是次版本号(Minor Version),第7,8字节是主版本号(Major Version) 。
    使用JDK 1.7编译输出Class文件,格式代码为:
    万字详解JVM,让你一文吃透

    文章插图
    前四个字节为魔数,次版本号是0x0000,主版本号是0x0033,说明本文件是可以被1.7及以上版本的虚拟机执行的文件 。
    • 33:JDK1.7
    • 32:JDK1.6
    • 31:JDK1.5
    • 30:JDK1.4
    • 2F:JDK1.3

    万字详解JVM,让你一文吃透

    文章插图
    类加载器类加载器的作用是什么?类加载器实现类的加载动作,同时用于确定一个类 。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性 。即使两个类来源于同一个Class文件,只要加载它们的类加载器不同,这两个类就不相等 。
    类加载器有哪些?
    1. 启动类加载器(Bootstrap ClassLoader):使用C++实现(仅限于HotSpot),是虚拟机自身的一部分 。负责将存放在\lib目录中的类库加载到虚拟机中 。其无法被Java程序直接引用 。
    2. 扩展类加载器(Extention ClassLoader)由ExtClassLoader实现,负责加载\lib\ext目录中的所有类库,开发者可以直接使用 。
    3. 应用程序类加载器(Application ClassLoader):由APPClassLoader实现 。负责加载用户类路径(ClassPath)上所指定的类库 。
    类加载机制什么是双亲委派模型?双亲委派模型(Parents Delegation Model)要求除了顶层的启动类加载器外,其余加载器都应当有自己的父类加载器 。类加载器之间的父子关系,通过组合关系复用 。
    工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成 。每个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有到父加载器反馈自己无法完成这个加载请求(它的搜索范围没有找到所需的类)时,子加载器才会尝试自己去加载 。
    为什么要使用双亲委派模型,组织类加载器之间的关系?Java类随着它的类加载器一起具备了一种带优先级的层次关系 。比如java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object类在程序的各个类加载器环境中,都是同一个类 。
    如果没有使用双亲委派模型,让各个类加载器自己去加载,那么Java类型体系中最基础的行为也得不到保障,应用程序会变得一片混乱 。

    经验总结扩展阅读