类加载器

类加载器类型

  • BootstrapClassLoader【启动类加载器

  • ExtClassLoader【标准扩展类加载器

  • ApplicationClassLoader【系统类加载器

  • CustomClassLoader【用户自定义类加载器

双亲委派机制

当一个类加载某个类.class 的时候,不会直接去加载

而是用户自定义类加载器委托系统类加载器委托标准扩展类加载器委托启动类加载器去加载

如果启动类加载器不加载这个,就交给标准扩展类加载器标准扩展类加载器不负责加载这个就系统类加载器,一层层的下去,然后最终加载到这个.class 类。

作用:保护 java 的核心类

  • 通过委托的方式,保证核心.class 不被篡改。可避免用户自己编写的类动态替换 Java 的核心类。
  • 防止加载同一个.class。避免全限定命名的类重复加载

JVM 的内存结构

1、五大区域

JVM 虚拟机内存结构图

  • 方法区:类加载器加载的类就放到方法区【该区归所有线程共享】
  • 堆内存: 实例变量存在堆内存中【该区归所有线程共享】
  • 栈内存:后进先出,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就 Over【是线程私有的】
  • 本地方法栈:内存中的一块区域负责登记 native方法【归所有线程共享】
  • 程序计数器:记录程序运行的位置和下一个方法的位置

2、堆

2.1、新生代

新生代主要用来存放新生的对象。一般占据堆空间的 1/3。

新生代的区域划分: 三块区域Eden 区、SurvivorFrom、ServivorTo 区

默认的空间占比: 8:1:1

新生代采用的是:复制算法

2.2、老年代

由新生代晋升而来的:

  • 新生代经过垃圾回收后,年级+1,默认是 15 岁以后进入老年代
  • 新生代区域放不下某个变量的时候,同时触发新生代的垃圾回收依然放不下,进入老年代

老年代采用的是:标记清除标记压缩

2.3、元空间

永久代在 Java8 中已经被移除,元空间与永久代之间最大的区别在于:元空间使用本地内存,而永久代使用的是 JVM 的内存。因此,默认情况下,元空间的大小仅受本地内存的限制。

类的元数据放入本地内存(native memory),字符串池和类的静态变量放入 java 堆中。这样可以加载多少类的元数据就不再由 MaxPermSize 控制,而由系统的实际可用空间来控制。

3、垃圾回收器

  • Serial old 和 Serial:单线程垃圾回收器
  • Parallel old 和 Parallel new:多线程垃圾回收器
  • CMS:并发进行的标记清除算法的垃圾回收器
  • G1:类似于 CMS 的垃圾回收器,但是进行垃圾回收的时间预测