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


分代收集算法根据对象的存活周期,将内存划分为几块 。一般是把 Java 堆分为新生代和老年代,这样就可以根据各个年代的特点,采用最适当的收集算法 。

  • 新生代:每次垃圾收集时会有大批对象死去 , 只有少量存活,所以选择复制算法 , 只需要少量存活对象的复制成本就可以完成收集 。
  • 老年代:对象存活率高、没有额外空间对它进行分配担保,必须使用“标记-清理”或“标记-整理”算法进行回收 。
Minor GC 和 Full GC有什么区别?Minor GC:新生代 GC,指发生在新生代的垃圾收集动作,因为 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般回收速度较快 。Full GC:老年代 GC,也叫 Major GC,速度一般比 Minor GC 慢 10 倍以上 。
Java 内存为什么要将堆内存分区?对于一个大型的系统,当创建的对象及方法变量比较多时,即堆内存中的对象比较多 , 如果逐一分析对象是否该回收,效率很低 。分区是为了进行模块化管理,管理不同的对象及变量,以提高 JVM 的执行效率 。
堆内存分为哪几块?
  1. Young Generation Space 新生区(也称新生代)
  2. Tenure Generation Space养老区(也称旧生代)
  3. Permanent Space 永久存储区
分代收集算法内存分配有哪些原则?
  1. 对象优先分配在 Eden
  2. 大对象直接进入老年代
  3. 长期存活的对象将进入老年代
  4. 动态对象年龄判定
  5. 空间分配担保
Young Generation Space (采用复制算法)主要用来存储新创建的对象,内存较小 , 垃圾回收频繁 。这个区又分为三个区域:一个 Eden Space 和两个 Survivor Space 。
  • 当对象在堆创建时,将进入年轻代的Eden Space 。
  • 垃圾回收器进行垃圾回收时 , 扫描Eden Space和A Suvivor Space,如果对象仍然存活,则复制到B Suvivor Space,如果B Suvivor Space已经满 , 则复制 Old Gen
  • 扫描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)上所指定的类库 。

    推荐阅读